2010-04-20 20 views
18

Şimdi böyle yapıyorum ama bunun yerine dosyanın başında yazmasını istiyorum. out.txt içeriği olur, böylecewrite()?

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

:

string 3 
string 2 
string 1 

değil (bu kod yapar gibi):

string 1 
string 2 
string 3 

cevap

12

this question'a bir göz atın. Orada bazı çözümler var.

muhtemelen aynı şekilde Daniel ve MAK önermek gider rağmen - belki işler biraz daha esnek ve açık hale getirmek için bir lil' sınıfı olun:

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

Her yazma arasında bir f.seek(0) atmak (veya yazabilirim Bunu sizin için yapan bir sarmalayıcı işlevi), ancak bunu yapmanın basit bir yolu yoktur.

EDIT: Bu, bir f.flush() yerleştirseniz bile, sürekli olarak üzerine yazacaktır. Yazıları sıraya koymak ve siparişi kendiniz tersine çevirmeniz gerekebilir. Daniel DiPaolo cevabı gerekçe olarak

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

:

Basitçe bir list yazmak isteyen tüm satırları eklemek

Yani yerine

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

Belki böyle bir şey yapmak. list'u ters çevirin ve ardından içeriğini dosyaya yazın.

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() 

Ayrıca deque kullanabilir ve onun başında yerine list kullanarak ve onu tersine çevirmeyi satırları ekleyin.

+0

Bunun kullanımı daha fazla bir günlük dosyasına benziyorsa, komut dosyası birbirini izleyen yürütmelerde günlüğe yazabilirse? Tüm dosyayı hafızada tutmanın tek çaresi, daha önce tüm içeriği takip eden eşyalarınızı yazmaya başlamak mı? (ara dosyalar yaratma hariç) –

+0

Python'un 'file' sınıfındaki herhangi bir şeyin (örneğin bir çeşit ara tampon kullanmadan) doğrudan bir şey yapmasına izin veren hiçbir şeyden haberdar değilim. Yani, şimdi, bu en basit yol gibi görünüyor. Bir günlük dosyası için, dosyanın sonuna yeni girişleri eklemek çok daha mantıklı ve hayatı kolaylaştıramaz mıydı? – MAK

+0

@Nick, @MAK Python'da bunun üstesinden gelebilecek hiçbir şey yok, temel C kütüphanesinde veya dosya sisteminde hiçbir şey yok. Bu, dosyaların nasıl çalıştığı değildir ve içeriği kopyalamak istemediğiniz sürece ekleme yapmaktan başka bir dosya oluşturamazsınız. Yeni bir dosya ile veya eski dosya içinde veri taşıyarak yapılabilir, ancak her iki durumda da büyük olasılıkla kötü bir fikirdir. Gereksinimleri veya sorunu görüntülediğiniz şekli daha iyi değiştirin ... –

1

kdtrv cevabı bir varyasyonu. Bu sürüm, mevcut dosya içeriğini tutar ve satır sırasını koruyan bir write_lines yöntemi sunar.

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', 
     ] 
    ) 
İlgili konular