返回文件大小总是得到 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
看到了吗? .getsize
在 with
中返回 0 - 因为它应该返回。
而那才是真正的原因。希望这能解决你的问题。这与“范围”完全无关
【讨论】:
以上是关于返回文件大小总是得到 0的主要内容,如果未能解决你的问题,请参考以下文章