题 你如何附加到文件?


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


1191
2018-01-16 16:20


起源


如果您正在寻找文件的连接,请查看以下答案: stackoverflow.com/questions/1001538/... - Scott C Wilson


答案:


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

1894
2018-01-16 16:24



这个 从教程可能也很有用。 - Dan
我注意到很多人都在使用 with open(file, "a") 方法。我可能是老式的,但有什么优势呢 open(file, "a") ... file.close()
bluewoodtree:其好处类似于C ++中的RAII。如果忘记close(),可能需要一段时间才能实际关闭文件。当代码有多个退出点,异常等时,您可能会想到忘记它会更容易。 - Petter
print("appended text", file=myfile)对于更熟悉的api来说也是可能的。 - Thomas Ahle
@Tom:不。 open() 没有硬编码 utf-8。它用 locale.getpreferredencoding(False)。通过 encoding="utf-8" 如果知道该文件使用utf-8编码,则显式显式。 - jfs


您需要在附加模式下打开文件,方法是将“a”或“ab”设置为模式。看到 打开()

当您以“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'

160
2018-01-16 16:23



所以我只使用file.write()函数并使文件为+ / a + b?
你不需要吗? close()? - Jonas Stein
@JonasStein,你应该用 with  - 看 docs.python.org/2/whatsnew/2.6.html#pep-343-the-with-statement - sinelaw
如果您正在写入Windows上的文本文件,请使用“test.txt”而不是“test”。 - ambassallo


我总是这样做,

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

它很简单,但非常有用。


35
2017-11-09 20:57



它写得更好一些,更安全一点:open('filename','a')为f:f.write('stuff') - Sam Redway
“a +”比“a”更好 - dell pk
它不像在这之前几年发布的大多数答案那么简单,而且它没有用处 - Tim Castelijns
@Tim Castelijns很高兴有人发布了一种替代的with语法,如果你在多个位置使用变量,你可能并不总是想要使用它。 - marsh
@marsh即使你通过了 f 变量到其他函数,打开文件的相同函数应该关闭它。该 with 语法是实现此目的的首选方法。 - Andrew Palmer


你可能想要通过 "a" 作为模式参数。请参阅文档 打开()

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

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


32
2018-01-16 16:31



file 阴影内置函数。不要将它用于变量。 - Mark Tolonen
@MarkTolonen: file 不再是Python 3中内置的。 即使在Python 2中,也很少使用它。打开文件是一种常见的操作。可以使用 file 在Python 2和3上都命名。 知道何时不一致。 - jfs


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

10
2017-12-29 15:51





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

10
2017-10-27 17:27





这是我的脚本,它基本上计算行数,然后追加,然后重新计算它们,以便你有证据证明它有效。

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

-4
2017-08-31 22:19