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

Posted

技术标签:

【中文标题】如何一次读取并附加到文本文件?【英文标题】:How do I read and append to a text file in one pass? 【发布时间】:2016-08-26 05:44:13 【问题描述】:

我想检查一个字符串是否在文本文件中,如果不存在则追加该字符串。

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

我想出的最接近的是:

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

我的文件.txt:

aaaaa
bbbbb

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

aaaaa
bbbbb
ccccc

但如果我再次运行它,就会出现这种情况:

aaaaa
bbbbb
ccc
ccccc

我希望第三行是ccccc

谁能解释为什么最后两个字符在第二次运行中被截断?另外,如何读取文本并将其附加到文件中?

【问题讨论】:

使用read() 会将指针放在文件末尾;应该不需要seek() 我运行了这段代码,字符没有被截断(python 2和3)。 @A.S file.seek(len(content)) 不是正确的做法,使用 file.seek(-1, os.SEEK_END) 【参考方案1】:

为什么不这样做呢?注意,第一个with 语句用于创建文件,而不是用于读取或追加。所以这个解决方案只使用一个 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")

【讨论】:

【参考方案2】:

使用这个:

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

这里我们使用fileObject.seek(offset[, whence])offset 0whence 2,即从末尾开始寻找0 个字符。然后写入文件。

或(使用 SEEK_END 替代):

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

南半球一定有人调换了投票按钮。为什么是-1,这是最好的答案。 那可能是南半球的某个人运行了代码。 @try-catch-finally 你试过了吗?你得到:Traceback (most recent call last): File "<stdin>", line 4, in <module> IOError: [Errno 0] Error @AniMenon - 我不知道 try-catch-finally 是否尝试过,但我在发布之前尝试过,它对我来说非常有效。 @AniMenon - 我得到了完美的输出。我无法重现您的错误。 @AniMenon - 你使用的是什么版本的 Python 和 Windows?【参考方案4】:

不要在文本文件上使用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")

【讨论】:

seek(0) 或 seek(-1) 如何破坏一切? 我会说 seek(0) 或 seek(0,2)。在官方文档中,seek(0,2) 被视为寻找文件末尾的正常方式。

以上是关于如何一次读取并附加到文本文件?的主要内容,如果未能解决你的问题,请参考以下文章

在vb中如何一次性地将文件内容读取到文本框

如何将文本附加到 Java 中的现有文件?

PHP将文件文本附加到所有javaScript文件

如何使用Python脚本从PDF中读取阿拉伯语文本

Tensorflow 2.3:如何并行读取大文件中的文本?

如何在不知道大小的情况下读取文本文件并存储到数组中?