如何在Python中附加文件?


1571

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

Answers:


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

10
教程中的内容也可能有用。

28
我注意到许多人正在使用该with open(file, "a")方法。我也许是过时的,但是相对而言,有什么优势open(file, "a") ... file.close()

75
bluewoodtree:好处类似于C ++中的RAII。如果您忘记了close(),则可能需要一段时间才能真正关闭文件。当代码具有多个退出点,异常等情况时,您可能会更容易想到忘记它。
皮特

54
print("appended text", file=myfile)对于更熟悉的api也是可能的。
Thomas Ahle 2014年

6
@汤姆:不。open()不硬编码utf-8。它使用locale.getpreferredencoding(False)encoding="utf-8"如果知道文件使用utf-8编码,则显式传递参数。
jfs

205

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

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

fseek(stream, 0, SEEK_END);

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

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

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

3
您不需要close()吗?
乔纳斯·斯坦


如果要在Windows上写入文本文件,请使用“ test.txt”而不是“ test”。
ambassallo,2016年

我想知道我的文件何时会在其他时候完成写入,而不是在文件末尾完成写入吗?
伊克拉。

47

我总是这样做

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

这很简单,但是非常有用。


12
它的编写起来更好一点,也更安全一些:使用open('filename','a')as f:f.write('stuff')
Sam Redway

2
“ a +”比“ a”更好
戴尔pk

6
它比大多数答案在此之前几年发布的答案要简单得多,并且没有更多用处
蒂姆

2
@Tim Castelijns很高兴有人发布了with语法的替代方法,如果您在多个位置使用变量,可能并不一定要使用。
沼泽

2
@marsh即使将f变量传递给其他函数,打开文件的同一函数也应将其关闭。该with语法是完成这一任务的首选方式。
Andrew Palmer

34

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

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

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


20
file阴影内置函数。不要将其用于变量。
Mark Tolonen 2011年

11
@MarkTolonen:file不再是Python 3中的内置函数。即使在Python 2中,也很少使用它。打开文件是一种常见的操作。file在Python 2和3上都可以在这里使用name。知道何时不一致。
2014年

33

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

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")

8

您也可以使用print代替write

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

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


1
这值得更多的投票!这是在没有附加逻辑的情况下正确附加端点的最简单方法。
–PrzemysławCzechowski

您还可以有一个标志WRITE_TO_FILE = open('my_file.txt', mode='a'),然后在程序执行过程中可以进行多次打印print('Hello world', file=WRITE_TO_FILE),只要您决定在控制台上查看输出,只需将标志更改为即可WRITE_TO_FILE = None。如果没有,请不要忘记最后关闭文件None
AlaaM。

5

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

import os

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

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


3

如果要附加到文件

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

我们声明了该变量myfile以打开名为的文件test.txt。Open有两个参数,一个是我们要打开的文件,另一个是代表我们要对该文件执行的权限或操作的字符串。

这是文件模式选项

模式说明

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

3

'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


1

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

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

a+open(...)声明中指示打开追加模式的文件,允许读取和写入访问。

使用file.close()完后,关闭所有打开的文件也是一种好习惯。


1
在“ with”块的末尾会自动调用“ file.close”,这是关键字的优势。另外,OP询问有关打开要附加的文件的问题。除非您也想阅读,否则“ +”模式不是必需的。
Erik Knowles

-6

这是我的脚本,基本上计算行数,然后追加,然后再对它们进行计数,这样您就可以证明它起作用了。

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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.