如何附加到文件?

2022-09-05 00:50:20

如何附加到文件而不是覆盖它?


答案 1

open() 中的模式设置为(追加)而不是(写入):"a""w"

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

文档列出了所有可用的模式。


答案 2

您需要通过设置“a”或“ab”作为模式,在追加模式下打开文件。请参阅 open()

当您以“a”模式打开时,写入位置将始终位于文件的末尾(追加)。您可以使用“a +”打开以允许读取,向后搜索和读取(但所有写入仍将位于文件末尾!

例:

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

注意:使用“a”与用“w”打开并搜索到文件末尾不同 - 考虑如果另一个程序打开文件并开始在查找和写入之间写入,会发生什么情况。在某些操作系统上,使用“a”打开文件可以保证所有后续写入操作都将以原子方式附加到文件末尾(即使文件因其他写入而增长)。


有关“a”模式如何运行的更多详细信息(仅在Linux上测试)。即使您寻求回溯,每次写入都会附加到文件的末尾:

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

事实上,手册页指出:fopen

在追加模式(a 作为模式的第一个字符)中打开文件会导致在此流的所有后续写入操作在文件末尾发生,就像在调用之前一样:

fseek(stream, 0, SEEK_END);

旧的简化答案(不使用):with

示例:(在实际程序中使用 with 关闭文件 - 请参阅文档)

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