ChatGPT解决这个技术问题 Extra ChatGPT

如何附加到文件?

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


P
Petter

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

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

documentation 列出了所有可用的模式。


教程中的 This 也可能有用。
bluewoodtree:好处与 C++ 中的 RAII 类似。如果您忘记了 close(),则可能需要一段时间才能真正关闭文件。当代码有多个退出点、异常等时,您可能会认为忘记它会更容易。
除了记住关闭之外,还有一个功能差异。 with 打开一个上下文管理器,即使在打开和 close() 之间出现错误,它也会关闭文件。
可以很容易地做到 with open("test.txt") as myfile: myfile.write("appended text",'a'),但在开放时需要 a。
@Timo TypeError: TextIOWrapper.write() 只接受一个参数(给定 2 个)
k
kmario23

您需要通过将“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 manpage 指出:

以追加模式打开文件(a 作为模式的第一个字符)会导致对该流的所有后续写入操作发生在文件末尾,就像在调用之前一样: fseek(stream, 0, SEEK_END);

旧的简化答案(不使用):

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

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

所以这意味着,多个句柄可以跨多个进程保存,而没有任何写冲突?
S
Seth Connell

我总是这样做,

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

这很简单,但非常有用。


写起来更好,更安全: with open('filename','a') as f: f.write('stuff')
o
oHo

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

i
istruble

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

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

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


file 隐藏内置函数。不要将它用于变量。
@MarkTolonen:file 不再是 Python 3 中的内置函数。Even in Python 2, it is used very rarely。打开文件是一种常见的操作。在 Python 2 和 3 上都可以在此处使用 file 名称。Know when to be inconsistent.
A
Alaa M.

您也可以使用 print 而不是 write

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

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


K
K.Suthagar

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

A
Alec

'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+' 参数赋予了更大的自由度。具体来说,它允许您在文件不存在时创建文件,以及清空当前存在的文件的内容。

Credit for this function goes to @Primusa


P
Primusa

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

import os

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

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


n
nima moradi

如果要附加到文件

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)

W
Walt Howard

如果多个进程正在写入文件,则必须使用附加模式,否则数据将被打乱。附加模式将使操作系统将每次写入都放在文件末尾,而不管作者认为他在文件中的位置如何。这是多进程服务(如 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 并不是说“打开文件,打开后到文件末尾一次”。这意味着,“打开文件,我所做的每一次写入都将在文件末尾”。

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


m
mattc-7

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

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

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

使用 file.close() 关闭已打开的所有文件也是一种很好的做法。


“file.close”在“with”块的末尾自动调用,这是关键字的优点。此外,OP 询问有关打开文件进行附加的问题。除非您也想阅读,否则不需要“+”模式。
t
travelingbones

这是我的脚本,它基本上计算行数,然后追加,然后再次计算它们,这样你就有证据证明它有效。

shortPath  = "../file_to_be_appended"
short = open(shortPath, 'r')

## this counts how many line are originally in the file:
long_path = "../file_to_be_appended_to" 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines initially" %(long_path,i)
long.close()

long = open(long_path, 'a') ## now open long file to append
l = True ## will be a line
c = 0 ## count the number of lines you write
while l: 
    try: 
        l = short.next() ## when you run out of lines, this breaks and the except statement is run
        c += 1
        long.write(l)

    except: 
        l = None
        long.close()
        print "Done!, wrote %s lines" %c 

## finally, count how many lines are left. 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines after appending new lines" %(long_path, i)
long.close()