如何追加到文件而不是覆盖它?
当前回答
如果多个进程正在写入文件,则必须使用追加模式,否则数据将被打乱。追加模式将使操作系统将每次写入都放在文件末尾,而不管写入者认为自己在文件中的位置。这是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");
追加最多并不意味着“打开文件,打开文件后转到文件末尾一次”。这意味着,“打开文件,我所做的每一次写入都将在文件末尾”。
警告:要使其生效,您必须在一次写入调用中一次性写入所有记录。如果您在多个写操作之间分割数据,其他写操作人员可以也将在您的写操作之间进行写操作,从而损坏您的数据。
其他回答
您可能希望传递“a”作为模式参数。请参阅open()的文档。
with open("foo", "a") as f:
f.write("cool beans...")
对于更新(+)、截断(w)和二进制(b)模式,模式参数还有其他排列,但最好以“a”开头。
有时,初学者会遇到这个问题,因为他们试图在循环中打开和写入文件:
for item in my_data:
with open('results.txt', 'w') as f:
f.write(some_calculation(item))
问题是,每次打开文件进行写入时,它都会被截断(清除)。
我们可以通过以追加模式打开来解决这个问题;但在这种情况下,通常最好通过颠倒逻辑来解决问题。如果文件只打开一次,那么每次都不会被覆盖;并且只要它是打开的,我们就可以继续写它——我们不必在每次写的时候都重新打开它(Python这样做是没有意义的,因为它会增加所需的代码而没有好处)。
因此:
with open('results.txt', 'w') as f:
for item in my_data:
f.write(some_calculation(item))
将open()中的模式设置为“a”(追加)而不是“w”(写入):
with open("test.txt", "a") as myfile:
myfile.write("appended text")
文档列出了所有可用模式。
你也可以用打印代替书写:
with open('test.txt', 'a') as f:
print('appended text', file=f)
如果test.txt不存在,将创建它。。。
当我们使用这行open(文件名,“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 dataframe pandas使用int删除列
- 如何使用批处理文件写入文本文件?
- 使用os.walk()在Python中递归遍历目录
- Git复制文件保存历史
- 在Python中,什么时候“i += x”与“i = i + x”不同?
- Python Flask,如何设置内容类型
- 删除字符串中的字符列表
- 当你的应用程序有一个tests目录时,在Django中运行一个特定的测试用例
- 如何合并一个透明的png图像与另一个图像使用PIL
- 使用散射数据集生成热图
- python:将脚本工作目录更改为脚本自己的目录
- 如何以编程方式获取python.exe位置?
- 如何跳过循环中的迭代?
- 使用Pandas为字符串列中的每个值添加字符串前缀
- ImportError:没有名为matplotlib.pyplot的模块