返回文件大小总是得到 0

Posted

技术标签:

【中文标题】返回文件大小总是得到 0【英文标题】:returning a filesize always get 0 【发布时间】:2020-06-29 18:00:04 【问题描述】:

所以基本上我有这段代码,它在 python 脚本中添加一行,然后计算它的大小,它工作正常

import os
def create_python_script(filename):
  comments = " Start of a new Python program"
  with open(filename,'w') as f :
    f.write(comments)
    f.close
    filesize = os.path.getsize(filename)
  return(os.path.getsize(filename))

print(create_python_script("program.py"))

它输出 30,这是文件的实际大小,因为它是空的,并且只有那一行

现在如果我用return(filesize) 更改return(os.path.getsize(filename)),这是合乎逻辑的,因为filesize = os.path.getsize(filename)我实际上得到了输出0

这是进行更改的第二个代码

import os
def create_python_script(filename):
  comments = " Start of a new Python program"
  with open(filename,'w') as f :
    f.write(comments)
    f.close
    filesize = os.path.getsize(filename)
  return(filesize)

print(create_python_script("program.py"))

有人可以向我解释为什么输出为 0 吗?

谢谢

【问题讨论】:

您不会使用f.close 关闭文件。这只是对方法对象的引用。您可以使用f.close() 将其关闭,但最好让with 阻止退出并完成其工作。 您实际上并没有关闭文件(f.close 什么都不做,试试f.close()) - 所以您写入的所有数据仍在内部缓冲区中,并且还没有尚未物理写入文件。 @jasonharper 您的解决方案有效,谢谢 【参考方案1】:

我可能错了,但是当“with”函数打开时它不会“更新文件”,所以尝试从“with”函数中删除 getsize

【讨论】:

【参考方案2】:

更正

我已经删除了f.close,当你使用with open()时不需要它 注意,filesize = os.path.getsize(filename) 的缩进

工作代码

import os
def create_python_script(filename):
    comments = " Start of a new Python program"
    with open(filename,'w') as f :
        f.write(comments)

    filesize = os.path.getsize(filename)
    return filesize

print(create_python_script("program.py"))

【讨论】:

【参考方案3】:

filesize 返回 0 的原因很简单。正如 cmets 所建议的,它与范围和/或文件关闭无关。再看看你的代码-

f.close 被删除首先:它什么都不做,其次:当您使用with open 打开它时,您不需要手动关闭文件)

with open(filename,'w') as f :
    f.write(comments)
    filesize = os.path.getsize(filename)
  return os.path.getsize(filename)

注意返回,getsize 是在 文件写入和关闭之后计算的,即 with 之外。在with 之后,文件已完成写入,并且它的实际大小已更新 - 因此,this 是您应该计算大小的时间。

现在看看替代方案-

with open(filename,'w') as f :
    f.write(comments)
    filesize = os.path.getsize(filename)
  return filesize

.getsize 在哪里计算? 之前文件关闭 - 因此文件尚未写入,大小当前为 0,因为文件在写入之前为空。

其实,试试这个-

with open(filename,'w') as f :
    f.write(comments)
    print(os.path.getsize(filename))
  return os.path.getsize(filename)

输出-

0
30

看到了吗? .getsizewith 中返回 0 - 因为它应该返回。

才是真正的原因。希望这能解决你的问题。这与“范围”完全无关

【讨论】:

以上是关于返回文件大小总是得到 0的主要内容,如果未能解决你的问题,请参考以下文章

perl中stat函数怎么计算文件的大小

创建一个返回新文件大小的python脚本

文件大小方法提升库奇数

Java文件对象大小返回0

得到文件大小

FtpClient上传文件速度非常慢,而且大小为0,上传失败