我正在尝试通过替换字符串的内容并编写更新的内容来更新文件中的内容。
现在,我需要删除较旧的内容并回写更新的内容,因此,我使用的是truncate
方法。
根据truncate
文件。截断([大小])
size可选。如果存在可选的大小参数,则文件为 截断到(最多)该大小。大小默认为当前 位置。
现在,我有两个案例,我无法理解发生了什么?
def fileIsWritingInBinary():
with open("hello.txt", "r+") as f:
fileContent = f.read()
f.truncate(0) # used different size argument
# update new content
fileContent = fileContent.replace("World", "StackOverFlow")
# write updated content
f.write(fileContent)
文件hello.txt
中写入的内容采用不同的格式,即
4865 6c6c 6f00 0000 0000 0000 0048 656c
6c6f 2c20 576f 726c 6421
但如下所述进行更改后,它可以很好地工作,即在f.seek(0)
来电之前添加truncate
。
def fileIsWritingInBinary():
with open("hello.txt", "r+") as f:
fileContent = f.read()
f.seek(0) // line added
f.truncate()
# update new content
fileContent = fileContent.replace("World", "StackOverFlow")
# write updated content
f.write(fileContent)
# hello.txt content
# Hello, StackOverFlow!
现在的问题是,
truncate(0)
调用导致文件以不同格式编写?0
更改为其他数字,但仍然得到了相同的结果。答案 0 :(得分:2)
如果您查看io
模块中的truncate
文档,您会看到发生了什么:
将流大小调整为给定大小(以字节为单位)(如果未指定大小,则调整当前位置)。 当前流位置未更改。此大小调整可以扩展或减少当前文件大小。在扩展的情况下,新文件区域的内容取决于平台(在大多数系统上,额外的字节是零填充的)。返回新的文件大小。
(强调我的)
因此即使你截断了流 - 你还没有改变流中的位置(seek
的作用)。当write
可能依赖于操作系统时,如何解决这个问题(在我的计算机上,第一个示例有效!)但是,您始终可以让Python tell
成为流中的当前位置:
with open("hello.txt", "r+") as f:
fileContent = f.read()
print(f.tell())
f.truncate(0)
print(f.tell())
f.seek(0)
print(f.tell())
# update new content
fileContent = fileContent.replace("World", "StackOverFlow")
# write updated content
f.write(fileContent)
print(f.tell())