2010-04-20 12 views
18

मैं इसे इस तरह कर रहा हूं, लेकिन मैं इसे फ़ाइल की शुरुआत में लिखना चाहता हूं।लिखें()?

f = open('out.txt', 'a') # or 'w'? 
f.write("string 1") 
f.write("string 2") 
f.write("string 3") 
f.close() 

ताकि out.txt की सामग्री हो जाएगा:

string 3 
string 2 
string 1 

और नहीं (इस कोड की तरह करता है):

string 1 
string 2 
string 3 

उत्तर

12

this question पर एक नज़र डालें। वहां कुछ समाधान हैं।

हालांकि मैं शायद जाना होता है कि एक ही तरह से डैनियल और MAK सुझाव है - हो सकता है चीजों को एक छोटे से अधिक लचीला और स्पष्ट करने के लिए एक Lil 'वर्ग बनाने:

class Prepender: 

    def __init__(self, fname, mode='w'): 
     self.__write_queue = [] 
     self.__f = open(fname, mode) 

    def write(self, s): 
     self.__write_queue.insert(0, s) 

    def close(self): 
     self.__exit__(None, None, None) 

    def __enter__(self): 
     return self 

    def __exit__(self, type, value, traceback): 
     if self.__write_queue: 
      self.__f.writelines(self.__write_queue) 
     self.__f.close() 

with Prepender('test_d.out') as f: 
    f.write('string 1\n') 
    f.write('string 2\n') 
    f.write('string 3\n') 
7

आप प्रत्येक लिखने के बीच एक f.seek(0) फेंक सकता है (या लिखने एक रैपर फ़ंक्शन जो आपके लिए करता है), लेकिन ऐसा करने के तरीके में कोई आसान नहीं बनाया गया है।

संपादित: यह काम नहीं करता, भले ही आप वहाँ यह लगातार ऊपर लिख देगा में एक f.flush() डाल दिया। आपको सिर्फ लिखना कतारबद्ध करना होगा और ऑर्डर को खुद को उलट देना होगा। डैनियल DiPaolo के जवाब पर विस्तार से चर्चा करते

writeList = [] 
writeList.append("string 1\n") 
writeList.append("string 2\n") 
writeList.append("string 3\n") 
writeList.reverse() 
f.writelines(writeList) 
1

:

आप सभी लाइनों है कि आप एक list लिए लिखना चाहते हैं संलग्न

तो बजाय

f.write("string 1") 
f.write("string 2") 
f.write("string 3") 

हो सकता है कि कुछ इस तरह से करते हैं। list को उलट दें और फिर फ़ाइल में अपनी सामग्री लिखें।

f=open('output.txt','w') 

l=[] 
l.append("string 1") 
l.append("string 2") 
l.append("string 3") 

for line in l: 
    f.write(line) 

f.close() 

तुम भी एक deque का उपयोग करें और अपनी शुरुआत के बजाय एक list उपयोग करने और इसे पीछे में लाइनों जोड़ सकते हैं।

+0

क्या होगा यदि इसका उपयोग लॉग फ़ाइल की तरह अधिक था, जहां स्क्रिप्ट लगातार निष्पादन पर लॉग पर लिख सकती है? क्या पूरी फाइल को स्मृति में रखने का एकमात्र सहारा है, अपनी पिछली सामग्री के बाद अपनी सामग्री लिखने की शुरुआत करना चाहते हैं? (इंटरमीडिएट फाइलों को छोड़कर) –

+0

मुझे पाइथन की 'फ़ाइल' कक्षा में कुछ भी पता नहीं है जो इस तरह कुछ की अनुमति देता है (यानी कुछ प्रकार के इंटरमीडिएट बफर का उपयोग किए बिना)। तो, अभी, यह सबसे आसान तरीका की तरह दिखता है। एक लॉग फ़ाइल के लिए, क्या यह बहुत अधिक समझ में नहीं आता है और फ़ाइल के अंत में नवीनतम प्रविष्टियों को जोड़ने के लिए जीवन को बहुत आसान बनाता है? – MAK

+0

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

1

kdtrv के जवाब पर एक बदलाव। यह संस्करण मौजूदा फ़ाइल सामग्री रखता है, और एक लाइन_लाइन विधि प्रदान करता है जो लाइन ऑर्डर को संरक्षित करता है।

class Prepender(object): 
    def __init__(self, 
       file_path, 
       ): 
     # Read in the existing file, so we can write it back later 
     with open(file_path, mode='r') as f: 
      self.__write_queue = f.readlines() 

     self.__open_file = open(file_path, mode='w') 

    def write_line(self, line): 
     self.__write_queue.insert(0, 
            "%s\n" % line, 
           ) 

    def write_lines(self, lines): 
     lines.reverse() 
     for line in lines: 
      self.write_line(line) 

    def close(self): 
     self.__exit__(None, None, None) 

    def __enter__(self): 
     return self 

    def __exit__(self, type, value, traceback): 
     if self.__write_queue: 
      self.__open_file.writelines(self.__write_queue) 
     self.__open_file.close() 


with Prepender('test_d.out') as f: 
    # Must write individual lines in reverse order 
    f.write_line('This will be line 3') 
    f.write_line('This will be line 2') 
    f.write_line('This will be line 1') 

with Prepender('test_d.out') as f: 
    # Or, use write_lines instead - that maintains order. 
    f.write_lines(
     ['This will be line 1', 
     'This will be line 2', 
     'This will be line 3', 
     ] 
    ) 
संबंधित मुद्दे