如何追加到文件?

How do I append to a file?

提问人: 提问时间:1/17/2011 最后编辑:Mateen Ulhaq 更新时间:10/19/2022 访问量:2120582

问:

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

python 文件 追加

评论


答:

263赞 sinelaw 1/17/2011 #1

您需要通过设置“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

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

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

评论

0赞 Rick Moritz 10/22/2021
因此,这意味着,可以在多个进程中保存多个句柄,而不会发生任何写入冲突?
3053赞 Petter 1/17/2011 #2

open() 中的模式设置为 (append) 而不是 (write):"a""w"

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

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

评论

14赞 Dan 7/30/2011
教程中的也可能很有用。
93赞 Petter 6/14/2013
bluewoodtree:优点与C++中的RAII相似。如果您忘记了 close(),则可能需要一段时间才能真正关闭文件。当代码有多个出口点、异常等时,你可能会更容易忘记它。
14赞 Brian 7/24/2020
除了记住关闭之外,还有一个功能上的区别。 打开上下文管理器,即使打开和之间出现错误,该管理器也会关闭文件。withclose()
0赞 Timo 1/26/2021
一个可以很容易地做到,但需要开放。with open("test.txt") as myfile: myfile.write("appended text",'a')
0赞 ー PupSoZeyDe ー 7/6/2021
@Timo TypeError:TextIOWrapper.write() 只接受一个参数(给定 2 个)
41赞 istruble 1/17/2011 #3

您可能希望作为 mode 参数传递。请参阅 open() 的文档。"a"

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

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

评论

21赞 Mark Tolonen 1/17/2011
fileshadows 内置函数。不要将其用于变量。
15赞 jfs 12/29/2014
@MarkTolonen:不再是 Python 3 中的内置。即使在 Python 2 中,也很少使用它。打开文件是一种常见的操作。可以在 Python 2 和 3 上在此处使用名称。知道什么时候不一致。filefile
59赞 Seth Connell 11/10/2014 #4

我总是这样做,

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

这很简单,但非常有用。

评论

27赞 Sam Redway 2/3/2015
写起来更好一点,更安全一点:使用 open('filename','a') 作为 f: f.write('stuff')
15赞 K.Suthagar 12/29/2016 #5

当我们使用这一行时,表示附加文件,这意味着允许将额外的数据插入到现有文件中。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")
49赞 Cleve Green 10/28/2017 #6

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
6赞 nima moradi 12/20/2018 #7

如果要追加到文件

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

我们声明了变量以打开一个名为 的文件。Open 需要 2 个参数,一个是要打开的文件,另一个是表示要对文件执行的权限或操作类型的字符串myfiletest.txt

这是文件模式选项

Mode    Description

'r' This is the default mode. It Opens file for reading.
'w' This Mode Opens file for writing. 
If file does not exist, it creates a new file.
If file exists it truncates the file.
'x' Creates a new file. If file already exists, the operation fails.
'a' Open file in append mode. 
If file does not exist, it creates a new file.
't' This is the default mode. It opens in text mode.
'b' This opens in binary mode.
'+' This will open a file for reading and writing (updating)
8赞 Primusa 2/8/2019 #8

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

import os

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

在模式下打开文件将允许您写入除末尾之外的其他文件位置,同时强制写入末尾。r+aa+

12赞 Alec 5/25/2019 #9

该参数表示追加模式。如果你不想每次都用,你可以很容易地写一个函数来为你做:'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

-4赞 mattc-7 12/13/2019 #10

将更多文本附加到文件末尾的最简单方法是使用:

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

in 语句指示在追加模式下打开文件,并允许读写访问。a+open(...)

使用完它们后,使用它们来关闭已打开的任何文件也始终是一种很好的做法。file.close()

评论

8赞 Erik Knowles 3/24/2020
“file.close”在“with”块的末尾自动调用,这是关键字的优势。此外,OP 还询问了打开文件进行追加的问题。“+”模式不是必需的,除非您也想阅读。
25赞 Alaa M. 1/12/2020 #11

您也可以使用以下方法代替:printwrite

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

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

5赞 Walt Howard 9/27/2020 #12

如果多个进程正在写入文件,则必须使用追加模式,否则数据将被打乱。追加模式将使操作系统将每次写入都放在文件的末尾,而不管编写者认为他在文件中的位置在哪里。这是 nginx 或 apache 等多进程服务的常见问题,其中同一进程的多个实例正在写入同一日志 文件。想想如果你试图寻找会发生什么,然后写下:

Example does not work well with multiple processes: 

f = open("logfile", "w"); f.seek(0, os.SEEK_END); f.write("data to write");

writer1: seek to end of file.           position 1000 (for example)
writer2: seek to end of file.           position 1000
writer2: write data at position 1000    end of file is now 1000 + length of data.
writer1: write data at position 1000    writer1's data overwrites writer2's data.

通过使用追加模式,操作系统会将任何写入放在文件末尾。

f = open("logfile", "a"); f.seek(0, os.SEEK_END); f.write("data to write");

Append most 并不意味着“打开文件,打开文件后转到文件末尾一次”。这意味着,“打开文件,我所做的每一次写入都将在文件的末尾”。

警告:要做到这一点,你必须在一次写调用中一次性写入所有记录。如果在多个写入之间拆分数据,其他写入器可以并且将会在您的写入之间进行写入并破坏您的数据。

-4赞 Karl Knechtel 10/19/2022 #13

有时,初学者会遇到这个问题,因为他们试图在循环中打开并写入文件:

for item in my_data:
    with open('results.txt', 'w') as f:
        f.write(some_calculation(item))

问题是每次打开文件进行写入时,它都会被截断(清除)。

我们可以通过在追加模式下打开来解决这个问题;但在这样的情况下,通常最好通过反转逻辑来解决问题。如果文件只打开一次,则不会每次都被覆盖;只要它是开放的,我们就可以继续写入它 - 我们不必为每个都重新打开它(对于 Python 来说,让事情以这种方式工作是没有意义的,因为它会增加所需的代码而没有任何好处)。write

因此:

with open('results.txt', 'w') as f:
    for item in my_data:
        f.write(some_calculation(item))

评论

0赞 crasu 12/24/2022
这并没有真正回答这个问题。
0赞 Karl Knechtel 12/25/2022
我之所以写它,是因为当初学者遇到由此问题引起的调试问题时,此 Q&A 有时会被用作重复项。