os.path.getsize(path) or os.stat

7
os.path.getsize(path)os.stat有什么不同?在Python 3中哪一个更好用?我们什么时候使用它们?为什么会有两种相同的解决方案?
我找到了这个答案(链接),但我不理解这句话的含义:
“从此可以看出,没有理由期望这两种方法的行为有所不同(除非您的代码循环结构不同)。”
具体来说,我们为什么有两种方法,它们有什么不同?

如果你在Linux上,可以使用strace程序并比较输出。 - RedEyed
文档显示:os.path.getsize? 签名:os.path.getsize(文件名) 文档字符串:返回由os.stat()报告的文件大小。 文件:/usr/lib/python3.5/genericpath.py 类型:函数 因此,os.path.getsize(path)只是对os.stat()的包装。 - RedEyed
2个回答

7

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)。

相关:


2
您所链接的答案表明,其中一个调用了另一个:
def getsize(filename):
    """Return the size of a file, reported by os.stat()."""
    return os.stat(filename).st_size

基本上,这两个函数都使用了 os.stat

为什么呢?可能是因为它们在两个不同的包中(pathstat)有相似的需求,而且不想复制代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接