如何一次读取并附加到文本文件?
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 0
和whence 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) 被视为寻找文件末尾的正常方式。以上是关于如何一次读取并附加到文本文件?的主要内容,如果未能解决你的问题,请参考以下文章