Python'daki bir dosyaya nasıl eklersiniz?


1574

Üzerine yazmak yerine dosyayı nasıl eklersiniz? Dosyaya eklenen özel bir işlev var mı?

Yanıtlar:


2448
with open("test.txt", "a") as myfile:
    myfile.write("appended text")

10
Bu öğreticiden de faydalı olabilir.
Dan

28
Birçok insanın with open(file, "a")yöntemi kullandığını fark ettim . Ben belki eski moda, ama ne üzerinde avantajı varopen(file, "a") ... file.close()

75
bluewoodtree: Faydaları C ++ 'da RAII'ye benzer. Close () öğesini unutursanız, dosyanın gerçekten kapatılması biraz zaman alabilir. Kodda birden fazla çıkış noktası, istisna vb. Varsa unutmayı düşünmek daha kolaydır.
Petter

54
print("appended text", file=myfile)daha tanıdık bir API için de mümkündür.
Thomas Ahle

6
@Tom: hayır. open()sabit kod içermez utf-8. Kullanır locale.getpreferredencoding(False). Geçiş encoding="utf-8"açıkça eğer biliyorum bu dosya kullandığı utf-8 kodlamasını parametresi.
jfs

206

Mod olarak "a" veya "ab" ayarını yaparak dosyayı ekleme modunda açmanız gerekir. Bkz. Open () .

"A" moduyla açtığınızda, yazma konumu her zaman dosyanın sonunda olur (bir ek). Okumaya izin vermek, geriye doğru aramak ve okumak için "a +" ile açabilirsiniz (ancak tüm yazma işlemleri dosyanın sonunda olacaktır!).

Misal:

>>> with open('test1','wb') as f:
        f.write('test')
>>> with open('test1','ab') as f:
        f.write('koko')
>>> with open('test1','rb') as f:
        f.read()
'testkoko'

Not : 'a' kullanmak, 'w' ile açmak ve dosyanın sonuna bakmakla aynı şey değildir - başka bir program dosyayı açıp arama ile yazma arasında yazmaya başlıyorsa ne olabileceğini düşünün. Bazı işletim sistemlerinde, dosyayı 'a' ile açmak, aşağıdaki tüm yazılarınızın dosyanın sonuna atomik olarak eklenmesini garanti eder (dosya diğer yazmalarla büyüse bile).


"A" modunun nasıl çalıştığı hakkında birkaç ayrıntı ( yalnızca Linux'ta test edilmiştir ). Geri arasanız bile, her yazma dosyanın sonuna eklenir:

>>> f = open('test','a+') # Not using 'with' just to simplify the example REPL session
>>> f.write('hi')
>>> f.seek(0)
>>> f.read()
'hi'
>>> f.seek(0)
>>> f.write('bye') # Will still append despite the seek(0)!
>>> f.seek(0)
>>> f.read()
'hibye'

Aslında, fopen manpage şöyle diyor:

Bir dosyayı ekleme modunda açmak (modun ilk karakteri olarak a), bu akışa izleyen tüm yazma işlemlerinin dosya çağrısında, çağrının öncesinde olduğu gibi gerçekleşmesine neden olur:

fseek(stream, 0, SEEK_END);

Eski basitleştirilmiş cevap (kullanmıyor with):

Örnek: ( gerçek bir programda dosyayı kapatmak için kullanınwith - belgelere bakın )

>>> open("test","wb").write("test")
>>> open("test","a+b").write("koko")
>>> open("test","rb").read()
'testkoko'

3
ihtiyacın yok close()mu?
Jonas Stein

9
@JonasStein, kullanmalısınız with- bkz. Docs.python.org/2/whatsnew/2.6.html#pep-343-the-with-statement
sinelaw

Windows'ta bir metin dosyasına yazıyorsanız, yalnızca "test" yerine "test.txt" kullanın.
ambassallo

Dosyamın başka bir noktada yazmayı bitireceğini biliyorum ama dosyanın sonunda değil mi?
Iqra.

49

Bunu hep yaparım,

f = open('filename.txt', 'a')
f.write("stuff")
f.close()

Basit ama çok kullanışlı.


12
yazmak için biraz daha hoş ve biraz daha güvenli: açık ('dosyaadı', 'a') ile f: f.write ('stuff')
Sam Redway

2
"a +", "a" dan daha iyidir
dell pk

6
Bundan birkaç yıl önce gönderilen cevapların çoğundan daha az basittir ve artık kullanışlı değildir
Tim

2
@Tim Castelijns Birinin sözdizimine bir alternatif yayınlaması, değişkeni birden çok konumda kullanıyorsanız her zaman kullanmak istemeyebileceğiniz hoş bir şey.
bataklık

2
@marsh fDeğişkeni diğer işlevlere geçiriyor olsanız bile , bir dosyayı açan aynı işlev onu kapatmalıdır. withSözdizimi Bunu gerçekleştirmek için tercih edilen bir yöntemdir.
Andrew Palmer

35

Muhtemelen "a"mod argümanı olarak geçmek istersiniz . Open () için dokümanlara bakın .

with open("foo", "a") as f:
    f.write("cool beans...")

Güncelleme (+), kesme (w) ve ikili (b) mod için mod bağımsız değişkeninin başka permütasyonları da vardır, ancak sadece "a"en iyi bahistir.


20
fileyerleşik bir işlevi gölgeler. Değişkenler için kullanmayın.
Mark Tolonen

11
@MarkTolonen: fileartık Python 3'te yerleşik değildir . Python 2'de bile çok nadiren kullanılır . Bir dosyayı açmak yaygın bir işlemdir. fileBurada hem Python 2 hem de 3'te isim kullanmakta sorun yoktur. Ne zaman tutarsız olacağını bilin.
jfs

34

Python'un ana üç moddan birçok varyasyonu vardır, bu üç mod şunlardır:

'w'   write text
'r'   read text
'a'   append text

Bir dosyaya eklemek şu kadar kolaydır:

f = open('filename.txt', 'a') 
f.write('whatever you want to write here (in append mode) here.')

Sonra kodunuzu daha az satır yapan modlar var:

'r+'  read + write text
'w+'  read + write text
'a+'  append + read text

Son olarak, ikili biçimde okuma / yazma modları vardır:

'rb'  read binary
'wb'  write binary
'ab'  append binary
'rb+' read + write binary
'wb+' read + write binary
'ab+' append + read binary

14

bu satırı kullandığımızda open(filename, "a"), yani adosyanın eklendiğini gösterir, yani mevcut dosyaya fazladan veri eklenmesine izin verilir.

Dosyanıza metin eklemek için aşağıdaki satırları kullanabilirsiniz

def FileSave(filename,content):
    with open(filename, "a") as myfile:
        myfile.write(content)

FileSave("test.txt","test1 \n")
FileSave("test.txt","test2 \n")

9

Bunu aşağıdakiler printyerine ile de yapabilirsiniz write:

with open('test.txt', 'a') as f:
    print('appended text', file=f)

Eğer test.txt yok, bu oluşturulacaktır ...


1
Bu daha fazla oyu hak ediyor! Ek mantık olmadan uç çizgileri düzgün şekilde eklemenin en kolay yolu budur.
Przemysław Czechowski

Ayrıca bir işaretiniz olabilir WRITE_TO_FILE = open('my_file.txt', mode='a')ve daha sonra programınız sırasında çeşitli baskılara sahip olabilirsiniz print('Hello world', file=WRITE_TO_FILE)ve konsoldaki çıktıyı görmeye her karar verdiğinizde bayrağı değiştirin WRITE_TO_FILE = None. Değilse sonunda dosyayı kapatmayı unutmayınNone
Alaa M.

6

Dosyayı r+modda da açabilir ve ardından dosyanın konumunu dosyanın sonuna ayarlayabilirsiniz.

import os

with open('text.txt', 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Dosyayı açma r+modu size ederken, sonuna yanında diğer dosya konumlarına yazalım olacak ave a+sonuna kadar kuvvet yazma.


4

bir dosyaya eklemek istiyorsanız

with open("test.txt", "a") as myfile:
    myfile.write("append me")

Değişkeni myfileadlı bir dosyayı açacağını beyan ettik test.txt. Open 2 argüman alır, açmak istediğimiz dosya ve dosyada yapmak istediğimiz izin veya işlemi gösteren bir dize

işte dosya modu seçenekleri

Mod Açıklaması

'r' Bu varsayılan moddur. Dosyayı okumak için açar.
'w' Bu Mod Dosyayı yazmak için açar. 
Dosya yoksa, yeni bir dosya oluşturur.
Dosya varsa, dosyayı kısaltır.
'x' Yeni bir dosya oluşturur. Dosya zaten varsa, işlem başarısız olur.
'a' Dosyayı ekleme modunda aç. 
Dosya yoksa, yeni bir dosya oluşturur.
't' Bu varsayılan moddur. Metin modunda açılır.
'b' Bu ikili modda açılır.
'+' Bu, okuma ve yazma için bir dosya açar (güncelleme)

4

'a'Parametre anlamına hangi modu ekleyin. with openHer seferinde kullanmak istemiyorsanız , sizin için yapacak bir işlevi kolayca yazabilirsiniz:

def append(txt='\nFunction Successfully Executed', file):
    with open(file, 'a') as f:
        f.write(txt)

Sondan başka bir yere yazmak isterseniz 'r+' kullanabilirsiniz :

import os

with open(file, 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Son olarak, 'w+'parametre daha fazla özgürlük sağlar. Özellikle, eğer yoksa, dosyayı oluşturmanıza ve o anda var olan bir dosyanın içeriğini boşaltmanıza izin verir.


Bu işlev için kredi @Primusa'ya gider


2

Bir dosyanın sonuna daha fazla metin eklemenin en basit yolu kullanmaktır:

with open('/path/to/file', 'a+') as file:
    file.write("Additions to file")
file.close()

a+İçinde open(...)deyim talimatını modu ekleme dosyayı açın ve okuma ve yazma erişimi verir etmek.

Ayrıca, file.close()açtıktan sonra açtığınız dosyaları kapatmak için kullanmak her zaman iyi bir uygulamadır .


1
"file.close", anahtar kelimenin avantajı olan "with" bloğunun sonunda otomatik olarak çağrılır. Ayrıca OP, eklenecek bir dosyayı açmayı sordu. Siz de okumak istemiyorsanız "+" modu gerekli değildir.
Erik Knowles

-6

İşte temelde satır sayısını sayan, daha sonra ekleyen, daha sonra tekrar sayan benim senaryom, böylece işe yaradığına dair kanıtınız var.

shortPath  = "../file_to_be_appended"
short = open(shortPath, 'r')

## this counts how many line are originally in the file:
long_path = "../file_to_be_appended_to" 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines initially" %(long_path,i)
long.close()

long = open(long_path, 'a') ## now open long file to append
l = True ## will be a line
c = 0 ## count the number of lines you write
while l: 
    try: 
        l = short.next() ## when you run out of lines, this breaks and the except statement is run
        c += 1
        long.write(l)

    except: 
        l = None
        long.close()
        print "Done!, wrote %s lines" %c 

## finally, count how many lines are left. 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines after appending new lines" %(long_path, i)
long.close()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.