如何附加到文件?

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

1988377 次浏览

您需要在追加模式下打开文件,将“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'

事实上,fopenmanpage指出:

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

fseek(stream, 0, SEEK_END);

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

示例:(在一个真正的程序中,使用#0关闭文件-请参阅留档

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

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

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

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

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

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

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

我总是这样做,

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

它很简单,但非常有用。

当我们使用这行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")

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

如果您想附加到文件

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

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

这里是文件模式选项

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)

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

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

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

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

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

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

open(...)语句中的a+指示以追加模式打开文件并允许读写访问。

使用file.close()关闭您使用完后打开的任何文件也是一种很好的做法。

您也可以使用print而不是write

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

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

如果多个进程正在写入文件,您必须使用追加模式,否则数据将被打乱。追加模式将使操作系统将每次写入都放在文件的末尾,而不管写入者认为他在文件中的位置在哪里。这是多进程服务(如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 1000writer2: 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");

追加最多没有的意思是,“打开文件,打开后转到文件末尾一次”。这意味着,“打开文件,我所做的每次写入都将在文件末尾”。

警告:为此,您必须在一次写入调用中一次性写入所有记录。如果您在多次写入之间拆分数据,其他写入者可以并且将会在您的写入之间写入并损坏您的数据。

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

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

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

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

因此:

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