如何一次读取并附加到文本文件?
How do I read and append to a text file in one pass?
我想检查一个字符串是否在文本文件中,如果不存在则追加该字符串。
我知道我可以通过创建两个单独的 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
。
谁能解释为什么最后两个字符 运行 出现在第二个 运行 中?另外,如何读取文本并将文本附加到文件?
使用这个:
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 包)然后写入它。
不要在文本文件上使用 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()
是基于字节的,您的文本文件可能不会以每个字符精确地编码一个字节。由于 read()
读取了整个文件并将指针留在末尾,因此无需查找。只需从您的代码中删除该行即可正常工作。
with open("file.txt","r+") as file:
content=file.read()
print("aaa" in content)
file.write("\nccccc")
为什么不这样做呢?请注意,第一个 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")
我想检查一个字符串是否在文本文件中,如果不存在则追加该字符串。
我知道我可以通过创建两个单独的 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
。
谁能解释为什么最后两个字符 运行 出现在第二个 运行 中?另外,如何读取文本并将文本附加到文件?
使用这个:
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 包)然后写入它。
不要在文本文件上使用 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()
是基于字节的,您的文本文件可能不会以每个字符精确地编码一个字节。由于 read()
读取了整个文件并将指针留在末尾,因此无需查找。只需从您的代码中删除该行即可正常工作。
with open("file.txt","r+") as file:
content=file.read()
print("aaa" in content)
file.write("\nccccc")
为什么不这样做呢?请注意,第一个 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")