如何向文件追加内容?

2046

如何在不覆盖文件的情况下向文件追加内容?

13个回答

3056
open()中的模式设置为"a"(追加)而不是"w"(写入):
with open("test.txt", "a") as myfile:
    myfile.write("appended text")

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


14
这个教程中的链接也许会有所帮助。 - Dan
93
“bluewoodtree: 这种方法的好处类似于C++中的RAII。如果你忘记了close(),可能要等一段时间才能真正关闭文件。当代码有多个退出点、异常等情况时,很容易忘记它。 - Petter
14
除了记得关闭外,with 还有一个功能上的区别。 with 打开一个上下文管理器,在打开和 close() 之间即使出现错误,也会关闭文件。 - Brian
可以轻松地使用with open("test.txt", 'a') as myfile: myfile.write("appended text"),但是在open中需要'a'。 - Timo
@Timo 类型错误:TextIOWrapper.write() 需要一个参数,但给出了两个。 - ー PupSoZeyDe ー
如果您想每次写入新行,这可能会很有用。 - Daniel

263

你需要使用追加模式打开文件,在模式中设置 "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手册页面中写道:打开一个文件以附加模式(mode以字符“a”开头)打开会导致所有后续对此流的写操作都发生在文件末尾,就好像在调用之前已经执行了这些写操作:
fseek(stream, 0, SEEK_END);

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

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

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

这意味着,多个句柄可以跨多个进程持有,而不会发生任何写冲突? - Rick Moritz

59

我总是这样做,

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

这很简单,但非常实用。


27
使用以下代码会更加友好和安全:with open('filename', 'a') as f: f.write('stuff')。 - Sam Redway

49

Python有许多基于主要三种模式的变体,这三种模式是:

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

所以要将内容添加到文件中,只需这样简单:
f = open('filename.txt', 'a') 
f.write('whatever you want to write here (in append mode) here.')

然后还有一些模式,只是让你的代码变得更简短:

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

最后,有二进制格式的读写模式:

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

41

你可能想将 "a" 作为模式参数传递。请查看与 open() 相关的文档。

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

还有其他用于更新(+)、截断(w)和二进制(b)模式的模式参数的排列组合,但以只使用"a"开始是最好的选择。


21
file 与一个内置函数同名,不要将其用作变量名。 - Mark Tolonen
15
在Python 3中,file不再是内置函数。即使在Python 2中,也很少使用它(参见https://dev59.com/fmct5IYBdhLWcg3wn-1z#11942631)。打开文件是一个常见操作。在Python 2和3中都可以使用file名称,知道何时不一致是可以接受的(参见https://www.python.org/dev/peps/pep-0008/#a-foolish-consistency-is-the-hobgoblin-of-little-minds)。 - jfs

25

你也可以使用 print 而不是 write 来实现:

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

如果 test.txt 文件不存在,它将会被创建...


15

当我们使用这条语句 open(filename, "a") 时,其中的 a 表示追加文件,也就是允许向现有文件中插入额外数据。

您只需使用以下几行代码即可将文本追加到文件中。

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

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

12

'a' 参数表示追加模式。如果你不想每次使用 with open,可以轻松编写一个函数为您完成:

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

如果你想在文件的其他位置进行写入,可以使用'r+'

import os

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

最后,'w+'参数提供了更多的自由。具体来说,它允许您在文件不存在时创建文件,并清空当前存在文件的内容。


此功能的制作者为@Primusa


8

您也可以以r+模式打开文件,然后将文件位置设置为文件末尾。

import os

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

r+模式打开文件后,除了末尾位置以外,您可以写入其他文件位置;而aa+则只能强制写入结尾。


6

如果您想要将内容追加到文件中

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

我们声明变量myfile来打开一个名为test.txt的文件。Open需要两个参数,我们要打开的文件和一个表示我们要对文件执行的权限或操作的字符串。
这里是文件模式选项
模式    描述
'r' 这是默认模式。它打开文件以供读取。 'w' 此模式打开文件以供写入。 如果文件不存在,则创建新文件。 如果文件存在,则截断文件。 'x' 创建一个新文件。如果文件已经存在,则操作失败。 'a' 以追加模式打开文件。 如果文件不存在,则创建新文件。 't' 这是默认模式。它以文本模式打开。 'b' 这将以二进制模式打开。 '+' 这将打开一个文件以供读取和写入(更新)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接