Bagaimana Anda menambahkan file dengan Python?

1574

Bagaimana Anda menambahkan file daripada menimpanya? Apakah ada fungsi khusus yang ditambahkan ke file?

Petter
sumber

Jawaban:

2448
with open("test.txt", "a") as myfile:
    myfile.write("appended text")
Petter
sumber
10
Ini dari tutorial mungkin berguna juga.
Dan
28
Saya perhatikan bahwa banyak orang menggunakan with open(file, "a")metode ini. Saya mungkin kuno, tapi apa kelebihannyaopen(file, "a") ... file.close()
75
bluewoodtree: Manfaatnya mirip dengan RAII di C ++. Jika Anda lupa tutup (), mungkin perlu beberapa saat sebelum file benar-benar ditutup. Lebih mudah bahwa Anda mungkin berpikir untuk melupakannya ketika kode memiliki beberapa titik keluar, pengecualian, dan sebagainya.
Petter
54
print("appended text", file=myfile)juga memungkinkan, untuk api yang lebih akrab.
Thomas Ahle
206

Anda perlu membuka file dalam mode append, dengan menetapkan "a" atau "ab" sebagai mode. Lihat buka () .

Ketika Anda membuka dengan mode "a", posisi menulis akan selalu berada di akhir file (sebuah lampiran). Anda dapat membuka dengan "a" untuk memungkinkan membaca, mencari mundur dan membaca (tetapi semua menulis masih di akhir file!).

Contoh:

>>> 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'

Catatan : Menggunakan 'a' tidak sama dengan membuka dengan 'w' dan mencari sampai akhir file - pertimbangkan apa yang mungkin terjadi jika program lain membuka file dan mulai menulis antara pencarian dan menulis. Pada beberapa sistem operasi, membuka file dengan jaminan 'a' bahwa semua tulisan Anda berikut akan ditambahkan secara atomis ke bagian akhir file (bahkan ketika file tersebut bertambah oleh tulisan lain).


Beberapa detail lebih lanjut tentang bagaimana mode "a" beroperasi (hanya diuji di Linux ). Bahkan jika Anda mencari kembali, setiap penulisan akan ditambahkan ke akhir file:

>>> 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'

Faktanya, halaman fopen manual menyatakan:

Membuka file dalam mode append (a sebagai karakter pertama dari mode) menyebabkan semua operasi penulisan berikutnya ke aliran ini terjadi pada akhir file, seolah-olah mendahului panggilan:

fseek(stream, 0, SEEK_END);

Jawaban lama yang disederhanakan (tidak menggunakan with):

Contoh: ( dalam program nyata digunakan withuntuk menutup file - lihat dokumentasi )

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

Saya selalu melakukan ini,

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

Sederhana, tetapi sangat bermanfaat.

Seth Connell
sumber
12
ini sedikit lebih baik dan sedikit lebih aman untuk menulis: dengan terbuka ('nama file', 'a') sebagai f: f.write ('barang')
Sam Redway
35

Anda mungkin ingin lulus "a"sebagai argumen mode. Lihat dokumen untuk open () .

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

Ada permutasi lain dari argumen mode untuk memperbarui (+), memotong (w) dan mode biner (b) tetapi mulai dengan hanya "a"merupakan taruhan terbaik Anda.

ramah
sumber
20
filemembayangi fungsi bawaan. Jangan gunakan itu untuk variabel.
Mark Tolonen
11
@MarkTolonen: filetidak lagi menjadi builtin dalam Python 3. Bahkan dalam Python 2, ini sangat jarang digunakan . Membuka file adalah operasi yang umum. Tidak masalah untuk menggunakan filenama di sini pada Python 2 dan 3. Ketahui kapan harus tidak konsisten.
jfs
34

Python memiliki banyak variasi dari tiga mode utama, tiga mode ini adalah:

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

Jadi untuk menambahkan file semudah:

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

Lalu ada mode yang hanya membuat kode Anda lebih sedikit baris:

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

Akhirnya, ada mode membaca / menulis dalam format biner:

'rb'  read binary
'wb'  write binary
'ab'  append binary
'rb+' read + write binary
'wb+' read + write binary
'ab+' append + read binary
Cleve Green
sumber
14

ketika kita menggunakan baris ini open(filename, "a"), itu amenunjukkan menambahkan file, itu berarti memungkinkan untuk memasukkan data tambahan ke file yang ada.

Anda bisa menggunakan baris berikut ini untuk menambahkan teks di file Anda

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

FileSave("test.txt","test1 \n")
FileSave("test.txt","test2 \n")
K. Suthagar
sumber
9

Anda juga dapat melakukannya dengan printbukannya write:

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

Jika test.txt tidak ada, itu akan dibuat ...

Alaa M.
sumber
6

Anda juga dapat membuka file dalam r+mode dan kemudian mengatur posisi file ke akhir file.

import os

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

Membuka file dalam r+mode akan memungkinkan Anda menulis ke posisi file lain di samping akhir, sementara adan a+memaksa menulis sampai akhir.

Primusa
sumber
4

jika Anda ingin menambahkan file

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

Kami menyatakan variabel myfileuntuk membuka file bernama test.txt. Buka membutuhkan 2 argumen, file yang ingin kita buka dan string yang mewakili jenis izin atau operasi yang ingin kita lakukan pada file

di sini adalah opsi mode file

Deskripsi Mode

'r' Ini adalah mode default. Membuka file untuk dibaca.
'w' Mode Ini Membuka file untuk ditulis. 
Jika file tidak ada, itu membuat file baru.
Jika ada file itu memotong file.
'x' Membuat file baru. Jika file sudah ada, operasi gagal.
'a' Buka file dalam mode tambahkan. 
Jika file tidak ada, itu membuat file baru.
't' Ini adalah mode default. Ini terbuka dalam mode teks.
'b' Ini terbuka dalam mode biner.
'+' Ini akan membuka file untuk membaca dan menulis (memperbarui)
nima moradi
sumber
4

The 'a'menandakan parameter modus menambahkan. Jika Anda tidak ingin menggunakannya with opensetiap kali, Anda dapat dengan mudah menulis fungsi untuk melakukannya untuk Anda:

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

Jika Anda ingin menulis di tempat lain selain akhir, Anda dapat menggunakan 'r+' :

import os

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

Akhirnya, 'w+'parameter ini memberikan lebih banyak kebebasan. Secara khusus, ini memungkinkan Anda untuk membuat file jika tidak ada, serta mengosongkan isi file yang saat ini ada.


Kredit untuk fungsi ini ke @Primusa

Alec Alameddine
sumber
2

Cara paling sederhana untuk menambahkan lebih banyak teks ke akhir file adalah dengan menggunakan:

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

The a+dalam open(...)menginstruksikan pernyataan untuk membuka file dalam modus append dan memungkinkan membaca dan akses tulis.

Ini juga selalu merupakan praktik yang baik untuk digunakan file.close()untuk menutup semua file yang telah Anda buka setelah Anda selesai menggunakannya.

mattc-7
sumber
1
"file.close" secara otomatis dipanggil di akhir blok "with", yang merupakan keunggulan kata kunci. Juga, OP bertanya tentang membuka file untuk ditambahkan. Mode "+" tidak diperlukan kecuali Anda juga ingin membaca.
Erik Knowles
-6

Inilah skrip saya, yang pada dasarnya menghitung jumlah baris, lalu menambahkan, lalu menghitungnya lagi sehingga Anda memiliki bukti bahwa itu berhasil.

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