Python截断方法大小参数行为

时间:2017-04-27 10:17:38

标签: python file

我正在尝试通过替换字符串的内容并编写更新的内容来更新文件中的内容。

现在,我需要删除较旧的内容并回写更新的内容,因此,我使用的是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!

现在的问题是,

  1. 为什么truncate(0)调用导致文件以不同格式编写?
  2. 我已将size参数从0更改为其他数字,但仍然得到了相同的结果。

1 个答案:

答案 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())