如何在Python中追加文件?

1446 python file append

如何附加到文件而不是覆盖它?是否有附加到文件的特殊功能?

Pet*_*ter 2254

with open("test.txt", "a") as myfile:
    myfile.write("appended text")
Run Code Online (Sandbox Code Playgroud)

  • bluewoodtree:其好处类似于C++中的RAII.如果忘记close(),可能需要一段时间才能实际关闭文件.当代码有多个退出点,异常等时,您可能会想到忘记它会更容易. (67认同)
  • 对于更熟悉的api,`print("附加文本",file = myfile)`也是可能的. (48认同)
  • 我注意到很多人都在使用`with open(file,"a")`方法.我可能是老式的,但与`open(file,"a")相比有什么优势... file.close()` (23认同)
  • 除了记住关闭之外,还有功能上的区别。`with` 打开一个上下文管理器,即使打开和 `close()` 之间存在错误,该管理器也会关闭文件。 (11认同)
  • 本教程中的[This](http://docs.python.org/tutorial/inputoutput.html)也可能有用. (8认同)
  • @Tom:不.`open()`不硬编码`utf-8`.它使用[`locale.getpreferredencoding(False)`](https://docs.python.org/3/library/functions.html#open).如果知道文件使用utf-8编码,则显式传递`encoding ="utf-8"`参数. (4认同)

sin*_*law 188

您需要在附加模式下打开文件,方法是将"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'
Run Code Online (Sandbox Code Playgroud)

注意:使用'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'
Run Code Online (Sandbox Code Playgroud)

实际上,fopen 联机帮助页指出:

以附加模式打开文件(作为模式的第一个字符)会导致对此流的所有后续写入操作发生在文件结尾处,就像在调用之前一样:

fseek(stream, 0, SEEK_END);
Run Code Online (Sandbox Code Playgroud)

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

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

>>> open("test","wb").write("test")
>>> open("test","a+b").write("koko")
>>> open("test","rb").read()
'testkoko'
Run Code Online (Sandbox Code Playgroud)

  • @JonasStein,你应该使用`with` - 参见http://docs.python.org/2/whatsnew/2.6.html#pep-343-the-with-statement (7认同)
  • 你不需要`close()`吗? (3认同)

Set*_*ell 46

我总是这样做,

f = open('filename.txt', 'a')
f.write("stuff")
f.close()
Run Code Online (Sandbox Code Playgroud)

它很简单,但非常有用.

  • 它写得更好一些,更安全一点:打开('filename','a')为f:f.write('stuff') (10认同)
  • 它不像在这之前几年发布的大多数答案那么简单,而且它没有用处 (6认同)
  • "a +"比"a"更好 (2认同)
  • @Tim Castelijns很高兴有人发布了一种替代的with语法,如果你在多个位置使用变量,你可能并不总是想要使用它. (2认同)
  • @marsh即使将`f`变量传递给其他函数,打开文件的同一函数也应将其关闭。with语法是完成此操作的首选方法。 (2认同)

ist*_*ble 34

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

with open("foo", "a") as f:
    f.write("cool beans...")
Run Code Online (Sandbox Code Playgroud)

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

  • `file`阴影内置函数.不要将它用于变量. (19认同)
  • @MarkTolonen:`file`不再是Python 3的内置函数.[即使在Python 2中,也很少使用它](http://stackoverflow.com/a/11942631/4279).打开文件是一种常见的操作.可以在Python 2和3上使用`file` name.[知道何时不一致.](https://www.python.org/dev/peps/pep-0008/#a-foolish-consistency -is最妖怪 - 的 - 小心灵) (10认同)

Cle*_*een 30

Python有三种主要模式的变体,这三种模式是:

'w'   write text
'r'   read text
'a'   append text
Run Code Online (Sandbox Code Playgroud)

因此,要附加到文件,它就像以下一样简单:

f = open('filename.txt', 'a') 
f.write('whatever you want to write here (in append mode) here.')
Run Code Online (Sandbox Code Playgroud)

然后有一些模式只会使你的代码更少的行:

'r+'  read + write text
'w+'  read + write text
'a+'  append + read text
Run Code Online (Sandbox Code Playgroud)

最后,还有二进制格式的读/写模式:

'rb'  read binary
'wb'  write binary
'ab'  append binary
'rb+' read + write binary
'wb+' read + write binary
'ab+' append + read binary
Run Code Online (Sandbox Code Playgroud)


Ala*_* M. 17

你也可以用print代替write

with open('test.txt', 'a') as f:
    print('appended text', file=f)
Run Code Online (Sandbox Code Playgroud)

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


K.S*_*gar 13

当我们使用此行时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")
Run Code Online (Sandbox Code Playgroud)


Pri*_*usa 7

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

import os

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

打开文件r+模式将让你写,除了年底其他文件的位置,而aa+力书写到最后。


Ale*_*ine 6

'a'参数表示追加模式。如果你不想with open每次都使用,你可以很容易地编写一个函数来为你做:

def append(txt='\nFunction Successfully Executed', file):
    with open(file, 'a') as f:
        f.write(txt)
Run Code Online (Sandbox Code Playgroud)

如果你想写除结尾以外的其他地方,你可以使用'r+'

import os

with open(file, 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")
Run Code Online (Sandbox Code Playgroud)

最后,'w+'参数授予更多的自由。具体来说,它允许您创建不存在的文件,以及清空当前存在的文件的内容。


此功能归功于@Primusa


nim*_*adi 5

如果你想附加到一个文件

with open("test.txt", "a") as myfile:
    myfile.write("append me")
Run Code Online (Sandbox Code Playgroud)

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

这是文件模式选项

模式说明

'r' 这是默认模式。它打开文件进行阅读。
'w' 此模式打开文件进行写入。 
如果文件不存在,它会创建一个新文件。
如果文件存在,它会截断文件。
'x' 创建一个新文件。如果文件已存在,则操作失败。
'a' 以追加模式打开文件。 
如果文件不存在,它会创建一个新文件。
't' 这是默认模式。它以文本模式打开。
'b' 以二进制模式打开。
'+' 这将打开一个文件进行读写(更新)


Wal*_*ard 5

如果多个进程正在写入文件,则必须使用追加模式,否则数据将被扰乱。追加模式将使操作系统将每次写入都放在文件末尾,无论写入者认为他在文件中的位置在哪里。这是 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.
Run Code Online (Sandbox Code Playgroud)

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

f = open("logfile", "a"); f.seek(0, os.SEEK_END); f.write("data to write");
Run Code Online (Sandbox Code Playgroud)

追加最多并不意味着“打开文件,打开后转到文件末尾一次”。这意味着“打开文件,我所做的每次写入都将位于文件末尾”。

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