提问人: 提问时间:1/17/2011 最后编辑:Mateen Ulhaq 更新时间:10/19/2022 访问量:2120582
如何追加到文件?
How do I append to a file?
答:
您需要通过设置“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'
评论
将 open(
) 中的模式设置为 (append) 而不是 (write):"a"
"w"
with open("test.txt", "a") as myfile:
myfile.write("appended text")
该文档列出了所有可用模式。
评论
with
close()
with open("test.txt") as myfile: myfile.write("appended text",'a')
您可能希望作为 mode 参数传递。请参阅 open() 的文档。"a"
with open("foo", "a") as f:
f.write("cool beans...")
mode 参数还有其他排列,用于更新 (+)、截断 (w) 和二进制 (b) 模式,但从 just 开始是最好的选择。"a"
评论
file
shadows 内置函数。不要将其用于变量。
file
file
我总是这样做,
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")
我们声明了变量以打开一个名为 的文件。Open 需要 2 个参数,一个是要打开的文件,另一个是表示要对文件执行的权限或操作类型的字符串myfile
test.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)
您也可以在模式下打开文件,然后将文件位置设置为文件的末尾。r+
import os
with open('text.txt', 'r+') as f:
f.seek(0, os.SEEK_END)
f.write("text to add")
在模式下打开文件将允许您写入除末尾之外的其他文件位置,同时强制写入末尾。r+
a
a+
该参数表示追加模式。如果你不想每次都用,你可以很容易地写一个函数来为你做:'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+'
将更多文本附加到文件末尾的最简单方法是使用:
with open('/path/to/file', 'a+') as file:
file.write("Additions to file")
file.close()
in 语句指示在追加模式下打开文件,并允许读写访问。a+
open(...)
使用完它们后,使用它们来关闭已打开的任何文件也始终是一种很好的做法。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 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 并不意味着“打开文件,打开文件后转到文件末尾一次”。这意味着,“打开文件,我所做的每一次写入都将在文件的末尾”。
警告:要做到这一点,你必须在一次写调用中一次性写入所有记录。如果在多个写入之间拆分数据,其他写入器可以并且将会在您的写入之间进行写入并破坏您的数据。
有时,初学者会遇到这个问题,因为他们试图在循环中打开并写入文件:
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))
评论