如何一次读取和附加到文本文件?

时间:2016-05-01 10:58:05

标签: python file file-writing file-read

我想检查一个字符串是否在文本文件中,然后附加该字符串(如果它不在那里)。

我知道我可以通过创建两个单独的with方法来实现这一点,一个用于阅读,另一个用于追加,但是是否可以在同一个with方法中读取和追加?

我想出的最接近的是:

with open("file.txt","r+") as file:
    content=file.read()
    print("aaa" in content)
    file.seek(len(content))
    file.write("\nccccc")

我的file.txt:

aaaaa
bbbbb

当我第一次运行代码时,我得到了这个:

aaaaa
bbbbb
ccccc

但如果我再次运行它,就会出现:

aaaaa
bbbbb
ccc
ccccc

我希望第三行是ccccc

任何人都可以解释为什么在第二次运行中截断最后两个字符?另外,如何阅读文本并将其附加到文件?

4 个答案:

答案 0 :(得分:5)

不要在文本文件上使用seek。在所有情况下,内容的长度不是文件的长度。要么使用二进制文件读取,要么使用两个单独的withs:

with open("file.txt","r") as file:
    content=file.read()
print("aaa" in content)
with open("file.txt","a") as file:
    file.write("\nccccc")

答案 1 :(得分:2)

使用此:

with open("file.txt","r+") as file:
    content=file.read()
    file.seek(0,2)
    file.write("\nccccc")

我们将fileObject.seek(offset[, whence])用于offset 0& whence 2从最后寻找0个字符。然后写入文件。

OR(使用SEEK_END替代):

import os
with open("file.txt", 'rb+') as file:
    file.seek(-1, os.SEEK_END)
    file.write("\nccccc\n")

这里我们寻找文件的SEEK_END(使用os包),然后写入它。

答案 2 :(得分:1)

seek()基于字节,并且您的文本文件可能不会使用每个字符恰好一个字节进行编码。由于read()读取整个文件并将指针留在最后,因此无需进行搜索。只需从代码中删除该行,它就可以正常工作。

with open("file.txt","r+") as file:
    content=file.read()
    print("aaa" in content)
    file.write("\nccccc")

答案 3 :(得分:1)

为什么不这样做?请注意,第一个with语句用于创建文件,而不是用于读取或追加。所以这个解决方案只使用一个来读取和追加。

string="aaaaa\nbbbbb"
with open("myfile", "w") as f:
    f.write(string)

with open("myfile", "r+") as f:
    if not "ccccc" in f.read():
        f.write("\nccccc")