os.path.getsize(path)
和os.stat
有什么不同?在Python 3中哪一个更好用?我们什么时候使用它们?为什么会有两种相同的解决方案?我找到了这个答案(链接),但我不理解这句话的含义:
“从此可以看出,没有理由期望这两种方法的行为有所不同(除非您的代码循环结构不同)。”
具体来说,我们为什么有两种方法,它们有什么不同?
os.path.getsize(path)
和os.stat
有什么不同?在Python 3中哪一个更好用?我们什么时候使用它们?为什么会有两种相同的解决方案?stat
是一个POSIX系统调用(可在Linux、Unix甚至Windows上使用),它返回一些信息(大小、类型、保护位等)。
Python必须在某个时候调用它以获取大小(并且确实这样做了),但没有系统调用可以仅获取大小。
因此,它们在性能方面是相同的(也许使用stat
会更快,但那只是多了一个函数调用,所以与I/O无关)。只是os.path.getsize
更容易编写。
话虽如此,要能够调用os.path.getsize
,您必须确保路径实际上是一个文件。当在目录上调用时,getsize
返回一些值(在Windows上测试),这可能与节点的大小有关,因此您必须首先使用os.path.isfile
:另一个调用os.stat
。
最后,如果要最大化性能,您必须使用os.stat
,检查信息以查看路径是否为文件,然后使用st_size
信息。这样,您只需调用一次stat
。
如果您正在使用os.walk
扫描目录,则会暴露更多隐藏的stat
调用,因此请查看os.scandir
(Python 3.5)。
相关:
def getsize(filename):
"""Return the size of a file, reported by os.stat()."""
return os.stat(filename).st_size
基本上,这两个函数都使用了 os.stat
。
为什么呢?可能是因为它们在两个不同的包中(path
和stat
)有相似的需求,而且不想复制代码。
strace
程序并比较输出。 - RedEyedos.path.getsize? 签名:os.path.getsize(文件名) 文档字符串:返回由os.stat()报告的文件大小。 文件:/usr/lib/python3.5/genericpath.py 类型:函数
因此,os.path.getsize(path)只是对os.stat()
的包装。 - RedEyed