Làm thế nào để bạn thêm vào một tập tin trong Python?


1574

Làm thế nào để bạn thêm vào tập tin thay vì ghi đè lên nó? Có một chức năng đặc biệt gắn vào tập tin?

Câu trả lời:


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

10
Điều này từ hướng dẫn có thể cũng hữu ích.
Dan

28
Tôi nhận thấy rằng nhiều người đang sử dụng with open(file, "a")phương pháp. Tôi có thể lỗi thời, nhưng lợi thế hơnopen(file, "a") ... file.close()

75
bluewoodtree: Những lợi ích tương tự như RAII trong C ++. Nếu bạn quên close (), có thể mất một lúc trước khi tệp thực sự bị đóng. Sẽ dễ dàng hơn khi bạn nghĩ để quên nó khi mã có nhiều điểm thoát, ngoại lệ, v.v.
Petter

54
print("appended text", file=myfile)cũng có thể, cho một api quen thuộc hơn.
Thomas Ahle

206

Bạn cần mở tệp ở chế độ chắp thêm, bằng cách đặt "a" hoặc "ab" làm chế độ. Xem mở () .

Khi bạn mở với chế độ "a", vị trí ghi sẽ luôn ở cuối tệp (phần phụ). Bạn có thể mở bằng "a +" để cho phép đọc, tìm ngược và đọc (nhưng tất cả các ghi sẽ vẫn ở cuối tệp!).

Thí dụ:

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

Lưu ý : Sử dụng 'a' không giống như mở bằng 'w' và tìm đến cuối tệp - xem xét điều gì có thể xảy ra nếu một chương trình khác mở tệp và bắt đầu viết giữa tìm kiếm và ghi. Trên một số hệ điều hành, việc mở tệp bằng 'a' đảm bảo rằng tất cả các lần ghi sau của bạn sẽ được nối nguyên tử vào cuối tệp (ngay cả khi tệp phát triển bằng cách ghi khác).


Một vài chi tiết khác về cách chế độ "a" hoạt động (chỉ được thử nghiệm trên Linux ). Ngay cả khi bạn tìm kiếm lại, mọi ghi sẽ xuất hiện ở cuối tệp:

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

Trong thực tế, fopen trang man nói:

Mở tệp ở chế độ chắp thêm (là ký tự đầu tiên của chế độ) khiến tất cả các thao tác ghi tiếp theo vào luồng này xảy ra ở cuối tệp, như thể trước cuộc gọi:

fseek(stream, 0, SEEK_END);

Câu trả lời đơn giản cũ (không sử dụng with):

Ví dụ: ( trong một chương trình thực tế sử dụng withđể đóng tệp - xem tài liệu )

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

49

Tôi luôn luôn làm điều này,

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

Nó đơn giản, nhưng rất hữu ích.


12
nó đẹp hơn một chút và an toàn hơn một chút để viết: với open ('filename', 'a') là f: f.write ('Stuff')
Sam Redway

35

Bạn có thể muốn vượt qua "a"như là đối số chế độ. Xem các tài liệu cho open () .

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

Có các hoán vị khác của đối số chế độ để cập nhật (+), cắt ngắn (w) và chế độ nhị phân (b) nhưng bắt đầu chỉ "a"là đặt cược tốt nhất của bạn.


20
filelàm mờ chức năng tích hợp. Đừng sử dụng nó cho các biến.
Đánh dấu Tolonen

11
@MarkTolonen: filekhông còn là nội dung trong Python 3. Ngay cả trong Python 2, nó rất hiếm khi được sử dụng . Mở một tập tin là một hoạt động phổ biến. Bạn có thể sử dụng filetên ở đây trên cả Python 2 và 3. Biết khi nào không nhất quán.
jfs

34

Python có nhiều biến thể trong ba chế độ chính, ba chế độ này là:

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

Vì vậy, để thêm vào một tập tin dễ dàng như:

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

Sau đó, có các chế độ chỉ làm cho mã của bạn ít dòng hơn:

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

Cuối cùng, có các chế độ đọc / ghi ở định dạng nhị phân:

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

14

khi chúng tôi sử dụng dòng này open(filename, "a"), điều đó acho biết việc nối thêm tệp, điều đó có nghĩa là cho phép chèn thêm dữ liệu vào tệp hiện có.

Bạn chỉ có thể sử dụng các dòng sau để nối thêm văn bản trong tệp của mình

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

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

9

Bạn cũng có thể làm điều đó với printthay vì write:

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

Nếu test.txt không tồn tại, nó sẽ được tạo ...


6

Bạn cũng có thể mở tệp ở r+chế độ và sau đó đặt vị trí tệp ở cuối tệp.

import os

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

Mở tệp ở r+chế độ sẽ cho phép bạn ghi vào các vị trí tệp khác ngoài đầu cuối, trong khi aa+buộc ghi vào cuối.


4

nếu bạn muốn thêm vào một tập tin

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

Chúng tôi đã khai báo biến myfileđể mở một tệp có tên test.txt. Open có 2 đối số, tệp mà chúng tôi muốn mở và một chuỗi đại diện cho các loại quyền hoặc hoạt động mà chúng tôi muốn thực hiện trên tệp

đây là tùy chọn chế độ tập tin

Chế độ Mô tả

'r' Đây là chế độ mặc định. Nó mở tập tin để đọc.
'w' Chế độ này Mở tệp để viết. 
Nếu tập tin không tồn tại, nó tạo ra một tập tin mới.
Nếu tập tin tồn tại, nó cắt ngắn tập tin.
'x' Tạo một tệp mới. Nếu tập tin đã tồn tại, hoạt động thất bại.
'a' Mở tệp trong chế độ chắp thêm. 
Nếu tập tin không tồn tại, nó tạo ra một tập tin mới.
't' Đây là chế độ mặc định. Nó mở trong chế độ văn bản.
'b' Điều này mở trong chế độ nhị phân.
'+' Điều này sẽ mở một tệp để đọc và viết (cập nhật)

4

Các 'a'biểu thị tham số thêm chế độ. Nếu bạn không muốn sử dụng with openmỗi lần, bạn có thể dễ dàng viết một hàm để làm điều đó cho bạn:

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

Nếu bạn muốn viết ở một nơi khác ngoài cuối, bạn có thể sử dụng 'r+' :

import os

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

Cuối cùng, 'w+'tham số cho phép tự do hơn nữa. Cụ thể, nó cho phép bạn tạo tệp nếu nó không tồn tại, cũng như làm trống nội dung của tệp hiện đang tồn tại.


Tín dụng cho chức năng này đi vào @Primusa


2

Cách đơn giản nhất để nối thêm văn bản vào cuối tệp sẽ là sử dụng:

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

Câu lệnh a+trong open(...)lệnh hướng dẫn mở tệp ở chế độ chắp thêm và cho phép truy cập đọc và ghi.

Nó cũng luôn luôn là cách tốt để sử dụng file.close()để đóng bất kỳ tệp nào bạn đã mở sau khi sử dụng xong.


1
"file.c Đóng" được tự động gọi ở cuối khối "với", đây là lợi thế của từ khóa. Ngoài ra, OP đã hỏi về việc mở một tệp để nối thêm. Chế độ "+" không cần thiết trừ khi bạn cũng muốn đọc.
Erik Knowles

-6

Đây là kịch bản của tôi, về cơ bản là đếm số dòng, sau đó nối thêm, sau đó đếm lại để bạn có bằng chứng.

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.