पायथन में पाठ फ़ाइल की फ़ाइल सामग्री को कैसे मिटाएं?


140

मेरे पास टेक्स्ट फाइल है जिसे मैं पायथन में मिटाना चाहता हूं। मैं उसको कैसे करू?


जवाब देने वाले लोगों ने कहा है कि यह संभव नहीं है .. तो क्या आप मुझे यह बताना चाहते हैं कि अजगर में इसे आसानी से कैसे किया जाए?
देहाती

जवाबों:


280

अजगर में:

open('file.txt', 'w').close()

या वैकल्पिक रूप से, यदि आपके पास पहले से कोई खुली हुई फ़ाइल है:

f = open('file.txt', 'r+')
f.truncate(0) # need '0' when using r+

C ++ में, आप कुछ इसी तरह का उपयोग कर सकते हैं।


#include<fstream>और फिर std::ofstream("file.txt");पायथन में जितना छोटा था। :)
विल्हेमटेल

8
इसका कारण यह है कि (C ++ और python दोनों में) काम करता है क्योंकि डिफ़ॉल्ट रूप से जब आप लिखने के लिए एक फ़ाइल खोलते हैं, तो यह मौजूदा सामग्रियों को काट देता है। तो वास्तव में यह एक साइड इफेक्ट है, और इस तरह मैं स्पष्ट कारणों के लिए स्पष्ट () के लिए स्पष्ट कॉल करना पसंद करूंगा, हालांकि यह अनावश्यक है।
rmeador

7
यदि आपने "r +" का उपयोग करके फ़ाइल खोली है, तो यदि आपने फ़ाइल पार्स की है तो ट्रंकट (0) का उपयोग करें, जिसकी आपके पास संभावना है। इसे पूरा करने के लिए ऊपर दिए गए उत्तर में जोड़ें!
जोहान एंजेलॉम

3
फ़ाइल की शुरुआत में पॉइंटर को स्थानांतरित करने के लिए f.seek (0) का उपयोग करें
जोहान एंग्लोम

मैं फाइल लिखने के साथ-साथ पढ़ भी रहा था। उत्तर पूरी तरह से फ़ाइल को काट देता है, लेकिन सावधान रहें यदि आप इसे फिर से लिखना चाहते हैं , तो f.seek(0)बाद में जोड़ना न भूलें f.truncate(0), अन्यथा आपके पास फ़ाइल के शुरू में अजीब \ x00 होगा।
कृष्ण चैतन्य

29

एक पूर्ण उत्तर नहीं है जो कि ओंद्रा के उत्तर के विस्तार का अधिक है

उपयोग करते समय truncate()(मेरी पसंदीदा विधि) सुनिश्चित करें कि आपका कर्सर आवश्यक स्थान पर है। जब एक नई फ़ाइल पढ़ने के लिए खोली जाती है - open('FILE_NAME','r')यह कर्सर डिफ़ॉल्ट रूप से 0 पर होता है। लेकिन अगर आपने फ़ाइल को अपने कोड में पार्स कर दिया है, तो फ़ाइल की शुरुआत में फिर से इंगित करना सुनिश्चित करें अर्थात truncate(0) डिफ़ॉल्ट रूप truncate()से वर्तमान क्यूसर स्थिति से शुरू होने वाली फ़ाइल की सामग्री को काट देता है।

एक साधारण उदाहरण


21

"राइट" मोड में एक फ़ाइल खोलने से यह साफ़ हो जाता है, आपको विशेष रूप से इसे लिखना नहीं है:

open("filename", "w").close()

(आपको इसे तब बंद करना चाहिए जब फ़ाइल स्वचालित रूप से बंद हो जाती है जब कार्यान्वयन विशिष्ट हो सकता है)


10

उपयोगकर्ता @jamylak का एक वैकल्पिक रूप open("filename","w").close()है

with open('filename.txt','w'): pass

8

उपयोग करते समय with open("myfile.txt", "r+") as my_file:, मुझे अजीब शून्य मिलते हैं myfile.txt, खासकर जब से मैं पहली बार फ़ाइल पढ़ रहा हूं। इसे काम करने के लिए, मुझे सबसे पहले my_fileफ़ाइल की शुरुआत के साथ पॉइंटर को बदलना होगा my_file.seek(0)। तब मैं my_file.truncate()फ़ाइल को खाली करने के लिए कर सकता था ।


1
यह आश्चर्यचकित नहीं होना चाहिए, इसका उत्तर 3 साल पहले दिया गया था।
एएमसी

6

आपको फ़ाइल को अधिलेखित करना होगा। C ++ में:

#include <fstream>

std::ofstream("test.txt", std::ios::out).close();

1
close()कॉल की कोई आवश्यकता नहीं है । विध्वंसक फ़ाइल को बंद कर देगा। तो आपको बस एक अस्थायी बनाने की आवश्यकता है:ofstream("test.txt");
विल्हेमटेल

इस जवाब के बाद से यह सवाल बदल गया है। शायद प्रश्न की नई दिशा दिए गए प्रश्न को हटा दें?
Seanny123

1

फ़ाइल पॉइंटर को आपके प्रोग्राम के अंदर नल करने के लिए असाइन करने से फ़ाइल के संदर्भ से छुटकारा मिल जाएगा। फ़ाइल अभी भी वहाँ है। मुझे लगता है कि remove()सी में फ़ंक्शन stdio.hवही है जो आप वहां खोज रहे हैं। अजगर के बारे में निश्चित नहीं है।


2
BTW, दोनों हटा () और अनलिंक () एक नियमित फ़ाइल पर संदर्भ संख्या को कम कर देगा, वास्तव में इसे मिटा नहीं। एक बार संदर्भ संख्या ड्रॉप शून्य पर फ़ाइल को मिटा दिया जाएगा। उदाहरण के लिए, यदि आपकी प्रक्रिया में फ़ाइल खुली है और आप उस पर अनलिंक () या हटा () कॉल करते हैं, तो यह तब तक नहीं हटाई जाएगी, जब तक कि फ़ाइल बंद न हो () d (यानी रेफरी ड्रॉप्स टू जीरो - भी कोई अन्य प्रक्रिया नहीं मानती है फ़ाइल को खोलें)। यह व्यवहार उपयोगी है, उदाहरण के लिए, यह सुनिश्चित करने के लिए कि असामान्य प्रक्रिया समाप्ति (जैसे खुला) (), अनलिंक (), प्रदर्शन IO, CRASH , क्लोज़ () नहीं कहा जाता है के बाद अस्थायी फ़ाइलों को आसपास नहीं छोड़ा गया है ।
शून्य

1

यदि आपके लिए सुरक्षा महत्वपूर्ण है, तो फ़ाइल को लिखने और फिर से बंद करने के लिए खोलना पर्याप्त नहीं होगा। कम से कम कुछ जानकारी अभी भी संग्रहण डिवाइस पर होगी और उदाहरण के लिए, डिस्क रिकवरी उपयोगिता का उपयोग करके पाया जा सकता है।

मान लीजिए, उदाहरण के लिए, आप जिस फ़ाइल को मिटा रहे हैं, उसमें उत्पादन पासवर्ड शामिल हैं और वर्तमान ऑपरेशन पूरा होने के तुरंत बाद हटा दिया जाना चाहिए।

एक बार आपके द्वारा उपयोग किए जाने के बाद फ़ाइल को जीरो-फिलिंग करने से संवेदनशील जानकारी नष्ट हो जाने को सुनिश्चित करने में मदद मिलती है।

हाल ही के एक प्रोजेक्ट पर हमने निम्न कोड का उपयोग किया, जो छोटे पाठ फ़ाइलों के लिए अच्छी तरह से काम करता है। यह शून्य की पंक्तियों के साथ मौजूदा सामग्रियों को ओवरराइट करता है।

import os

def destroy_password_file(password_filename):
    with open(password_filename) as password_file:
        text = password_file.read()
    lentext = len(text)
    zero_fill_line_length = 40
    zero_fill = ['0' * zero_fill_line_length
                      for _
                      in range(lentext // zero_fill_line_length + 1)]
    zero_fill = os.linesep.join(zero_fill)
    with open(password_filename, 'w') as password_file:
        password_file.write(zero_fill)

ध्यान दें कि शून्य-भरना आपकी सुरक्षा की गारंटी नहीं देगा। यदि आप वास्तव में चिंतित हैं, तो आप अपने ड्राइव पर 'खाली' स्थान को साफ करने के लिए फाइल श्रेडर या CCleaner जैसी विशेषज्ञ उपयोगिता का उपयोग शून्य-भरण और उपयोग करना सबसे अच्छा होगा ।


0

जब तक आपको अंत को मिटाने की आवश्यकता नहीं होती है, तब तक आप किसी फ़ाइल में जगह से "मिटा" नहीं सकते। या तो एक "खाली" मान के ओवरराइट के साथ सामग्री हो, या जिस फ़ाइल की आप परवाह करते हैं उसके हिस्सों को पढ़ें और इसे किसी अन्य फ़ाइल पर लिखें।


ठीक है कि कचरा मूल्य दिए बिना इसे कैसे अधिलेखित किया जाए? मेरा मतलब है कि 9 की एक स्ट्रिंग लंबाई है और मैं इसे 6 की स्ट्रिंग लंबाई के साथ अधिलेखित कर रहा हूं। इसका मतलब 3 कचरा मूल्य आरटी होगा?
देहाती

सही बात। इसके अलावा, आपके पास किसी भी पाठक को इस तथ्य की पहचान करने का कोई तरीका होगा कि वे 3 वर्ण कचरा हैं।
इग्नासियो वाज़केज़-अब्राम्स

तथ्य यह है कि मेरा कोड अजगर और सी ++ के बीच फैला हुआ है। इसलिए यदि कोई फ़ाइल पढ़ने के लिए C ++ में किया जाता है और फ़ाइल को अजगर में लिखा जाता है .. तो दोनों समय फ़ाइल को मिटाना होगा ..
Hick

0

चूंकि पाठ फाइलें अनुक्रमिक हैं, आप सीधे उन पर डेटा मिटा नहीं सकते। आपके विकल्प हैं:

  • सबसे आम तरीका एक नई फ़ाइल बनाना है। मूल फ़ाइल से पढ़ें और नई फ़ाइल पर सब कुछ लिखें, उस हिस्से को छोड़कर जिसे आप मिटाना चाहते हैं। जब सभी फ़ाइल लिखी गई हो, तो पुरानी फ़ाइल को हटा दें और नई फ़ाइल का नाम बदलें ताकि उसका मूल नाम हो।
  • आप उस बिंदु से पूरी फ़ाइल को काट और फिर से लिख सकते हैं जिसे आप बाद में बदलना चाहते हैं। आप जिस बिंदु को बदलना चाहते हैं उसे इंगित करें, और शेष फ़ाइल को मेमोरी में पढ़ें। उसी बिंदु पर वापस जाएं, फ़ाइल को काटें, और उस हिस्से के बिना सामग्री वापस लिखें जिसे आप मिटाना चाहते हैं।
  • एक और सरल विकल्प एक ही लंबाई के दूसरे डेटा के साथ डेटा को अधिलेखित करना है। उसके लिए, सटीक स्थिति की तलाश करें और नया डेटा लिखें। सीमा यह है कि इसकी लंबाई समान होनी चाहिए।

उपरोक्त किसी भी विचार को लागू करने के लिए seek/ truncateफ़ंक्शन / विधि को देखें। पायथन और सी दोनों के कार्य हैं।


मैं सिर्फ
भीख मांगने

2
फिर बस फ़ाइल को हटा दें। का प्रयोग करें os.removeया os.unlinkअजगर में, या unlinkसी में एक अन्य विकल्प सिर्फ लेखन या उपयोग के लिए फ़ाइल को फिर से खोलने के लिए है truncate
nosklo

0

लेखन और फ़ाइल सामग्री पढ़ना

def writeTempFile(text = ''):
    filePath = "/temp/file1.txt"
    if not text:                      # If blank return file content
        f = open(filePath, "r")
        slug = f.read()
        return slug
    else:
        f = open(filePath, "a") # Create a blank file
        f.seek(0)  # sets  point at the beginning of the file
        f.truncate()  # Clear previous content
        f.write(text) # Write file
        f.close() # Close file
        return text

इसने मेरे लिए काम किया


0

आप इसका उपयोग भी कर सकते हैं (उपरोक्त कुछ उत्तर के आधार पर):

file = open('filename.txt', 'w')
file.write('')
file.close

बेशक यह एक फ़ाइल को साफ़ करने का एक बहुत बुरा तरीका है क्योंकि इसके लिए कोड की बहुत सारी लाइनों की आवश्यकता होती है, लेकिन मैंने आपको यह दिखाने के लिए लिखा है कि यह इस तरीके से भी किया जा सकता है।

खुश कोडिंग!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.