Câu hỏi Làm thế nào để bạn thêm vào một tập tin?


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


1191
2018-01-16 16:20


gốc


Nếu bạn đang tìm kiếm các tệp nối, hãy xem câu trả lời này: stackoverflow.com/questions/1001538/… - Scott C Wilson


Các câu trả lời:


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

1894
2018-01-16 16:24



Điều này từ hướng dẫn có thể hữu ích. - Dan
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ó lẽ đã lỗi thời, nhưng lợi thế là gì open(file, "a") ... file.close()
bluewoodtree: Các lợi ích tương tự như của RAII trong C ++. Nếu bạn quên đóng (), có thể mất một lúc trước khi tệp thực sự bị đóng. Nó dễ dàng hơn mà bạn có thể nghĩ để quên nó khi mã có nhiều điểm thoát, ngoại lệ và như vậy. - Petter
print("appended text", file=myfile)cũng có thể, cho một api quen thuộc hơn. - Thomas Ahle
@Tom: không. open() không mã hóa utf-8. Nó sử dụng locale.getpreferredencoding(False). Vượt qua encoding="utf-8" tham số một cách rõ ràng nếu biết rằng tệp sử dụng mã hóa utf-8. - jfs


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 luôn ở cuối tệp (phụ lục). Bạn có thể mở bằng "a +" để cho phép đọc, tìm kiếm ngược và đọc (nhưng tất 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'

chú thích: Sử dụng 'a' không giống như mở bằng 'w' và tìm đến cuối tệp - hãy xem xét điều gì có thể xảy ra nếu chương trình khác mở tệp và bắt đầu viết giữa tìm kiếm và viết. 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 bài viết sau của bạn sẽ được nối thêm nguyên tử vào cuối tệp (ngay cả khi tệp được viết bởi các bài viết 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ẽ thêm vào 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'

Trên thực tế fopen  manpage tiểu bang:

Mở tệp ở chế độ chắp thêm (một ký tự đầu tiên của chế độ)   gây ra tất cả các hoạt động ghi tiếp theo cho luồng này xảy ra tại   cuối tập tin, 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):

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

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

160
2018-01-16 16:23



vì vậy tôi chỉ sử dụng chức năng file.write () và làm cho tập tin a + / a + b?
bạn không cần một close()? - Jonas Stein
@ JonasStein, bạn nên sử dụng with - xem docs.python.org/2/whatsnew/2.6.html#pep-343-the-with-statement - sinelaw
sử dụng "test.txt" thay vì chỉ "kiểm tra" nếu bạn đang viết vào một tệp văn bản trên cửa sổ. - ambassallo


Tôi 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.


35
2017-11-09 20:57



nó đẹp hơn một chút và an toàn hơn một chút để viết: với mở ('filename', 'a') là f: f.write ('stuff') - Sam Redway
"a +" tốt hơn "a" - dell pk
Nó ít đơn giản hơn hầu hết các câu trả lời được đăng vài năm trước một câu trả lời và nó không hữu ích hơn - Tim Castelijns
@Tim Castelijns Tốt đẹp của nó là ai đó đã đăng một thay thế cho cú pháp mà bạn có thể không phải lúc nào cũng muốn sử dụng nếu bạn đang sử dụng biến trên nhiều vị trí. - marsh
@marsh Ngay cả khi bạn đang vượt qua f biến thành các hàm khác, cùng chức năng mở tệp sẽ đóng nó. Các with cú pháp là cách ưu tiên để thực hiện điều này. - Andrew Palmer


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

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 bằng "a" là đặt cược tốt nhất của bạn.


32
2018-01-16 16:31



file đổ bóng một hàm dựng sẵn. Không sử dụng nó cho các biến. - Mark Tolonen
@MarkTolonen: file không còn là nội trang dựng sẵn trong Python 3. Ngay cả trong Python 2, nó được sử dụng rất hiếm khi. Mở một tệp là một thao tác phổ biến. Nó là ok để sử dụng file tên ở đây trên cả Python 2 và 3. Biết khi nào không nhất quán. - jfs


khi chúng ta sử dụng dòng này open(filename, "a"), cái đó a cho biết việc bổ sung 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 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")

10
2017-12-29 15:51





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 nó 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

10
2017-10-27 17:27





Đây là kịch bản của tôi, về cơ bản đếm số lượng các dòng, sau đó nối thêm, sau đó đếm chúng một lần nữa để bạn có bằng chứng nó hoạt độ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()

-4
2017-08-31 22:19