如何在 Python 中检查文件大小?

How do I check file size in Python?

提问人:5YrsLaterDBA 提问时间:1/21/2010 最后编辑:Mateen Ulhaq5YrsLaterDBA 更新时间:11/16/2023 访问量:1010537

问:

如何在 Python 中获取文件的大小?

python 文件

评论


答:

1473赞 danben 1/21/2010 #1

使用 os.path.getsize

>>> import os
>>> os.path.getsize("/path/to/file.mp3")
2071611

输出以字节为单位。

评论

183赞 wim 3/21/2013
注意:实现很简单os.path.getsizereturn os.stat(filename).st_size
1赞 wordsforthewise 5/18/2015
那么,使用 os.path.getsize 而不是 os.stat(file).st_size 是否会造成微小的性能损失?
10赞 Davidmh 7/15/2015
@wordsforthewise测量它!~150 ns 在我的电脑中。
6赞 greggo 12/22/2019
@wordsforthewise如果您还想获取有关文件的其他信息(例如修改时间、文件类型),那么这更是一个问题——那么您不妨通过 .然后差异可能会达到相当大的微秒:-)os.stat
0赞 Kai Petzke 11/7/2023
直接使用的另一个优点是,它接受相对于目录文件描述符的文件名,如 中所示,而不接受。在解析目录树时,可能是一个很大的优势。os.stat()dir_fdos.stat(relname, dir_fd=mydirfd).st_sizeos.path.getsize()dir_fd
1044赞 Adam Rosenfield 1/21/2010 #2

您需要 os.stat 返回的对象st_size 属性。您可以使用 pathlib (Python 3.4+) 获取它:

>>> from pathlib import Path
>>> Path('somefile.txt').stat()
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> Path('somefile.txt').stat().st_size
1564

或使用 os.stat

>>> import os
>>> os.stat('somefile.txt')
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> os.stat('somefile.txt').st_size
1564

输出以字节为单位。

评论

3赞 Tomasz Gandor 4/23/2016
@josch - 是的,这很好,对于“磁盘大小”,您可以乘以块大小,但我仍在寻找如何以编程和跨平台方式获取它(而不是通过等)stat_result.st_blockstune2fs
2赞 Alexandr Zarubkin 4/14/2023
@TomaszGandor现在定义为“分配给文件的 512 字节块数”,因此您不必获取块大小。st_blocks
150赞 Mark E. Haase 9/29/2013 #3

其他答案适用于真实文件,但如果您需要适用于“类文件对象”的东西,请尝试以下方法:

# f is a file-like object. 
f.seek(0, os.SEEK_END)
size = f.tell()

在我有限的测试中,它适用于真实文件和 StringIO。(Python 2.7.3.)当然,“类文件对象”API 并不是一个严格的接口,但 API 文档表明类文件对象应该支持 和 .seek()tell()

编辑

这与文件之间的另一个区别是,即使您没有权限读取文件,也可以访问文件。显然,除非您获得阅读权限,否则搜索/告诉方法将不起作用。os.stat()stat()

编辑 2

在乔纳森的建议下,这是一个偏执的版本。(上面的版本将文件指针保留在文件的末尾,因此如果您尝试从文件中读取,您将返回零字节!

# f is a file-like object. 
old_file_position = f.tell()
f.seek(0, os.SEEK_END)
size = f.tell()
f.seek(old_file_position, os.SEEK_SET)

评论

2赞 luckydonald 12/2/2015
对于最后一行,如果未使用:osf.seek(old_file_position, 0)
69赞 Mark E. Haase 12/3/2015
如果你使用整数文本而不是命名变量,你就是在折磨任何必须维护你的代码的人。没有令人信服的理由不导入 .os
4赞 Translunar 8/18/2018
显然,这至少有点风险,具体取决于 Python 的实现方式:wiki.sei.cmu.edu/confluence/display/c/......#seek()
107赞 Rajiv Sharma 10/12/2016 #4
import os


def convert_bytes(num):
    """
    this function will convert bytes to MB.... GB... etc
    """
    for x in ['bytes', 'KB', 'MB', 'GB', 'TB']:
        if num < 1024.0:
            return "%3.1f %s" % (num, x)
        num /= 1024.0


def file_size(file_path):
    """
    this function will return the file size
    """
    if os.path.isfile(file_path):
        file_info = os.stat(file_path)
        return convert_bytes(file_info.st_size)


# Lets check the file size of MS Paint exe 
# or you can use any file path
file_path = r"C:\Windows\System32\mspaint.exe"
print file_size(file_path)

结果:

6.1 MB

评论

5赞 Mattwmaster58 6/8/2018
第 10 行可以在 Python 中更改为 >= 3.5。return f'{num:.1f} {x}'
0赞 MZA 8/3/2020
谢谢 Matt M.,略有更新,第 10 行可以在 Python 中更改为 >= 3.5return f'{num}{unit}' if unit == 'bytes' else f'{num:.1f}{unit}'
0赞 lam vu Nguyen 3/31/2023
file_info = os.stat(file_path).st_size
66赞 Michael Mulich 11/18/2016 #5

使用(在 Python 3.4 或 PyPI 上可用的向后移植中添加):pathlib

from pathlib import Path
file = Path() / 'doc.txt'  # or Path('./doc.txt')
size = file.stat().st_size

这实际上只是一个接口,但使用提供了一种访问其他文件相关操作的简单方法。os.statpathlib

9赞 Victor Barrantes 3/14/2017 #6

严格坚持这个问题,Python 代码(+伪代码)将是:

import os
file_path = r"<path to your file>"
if os.stat(file_path).st_size > 0:
    <send an email to somebody>
else:
    <continue to other things>
30赞 user1767754 12/2/2017 #7

如果我想从任何其他单位转换,我可以使用一个技巧。如果你做一个右移,你基本上是按顺序(倍数)移位。bitshiftbytes10

例:5GB are 5368709120 bytes

print (5368709120 >> 10)  # 5242880 kilobytes (kB)
print (5368709120 >> 20 ) # 5120 megabytes (MB)
print (5368709120 >> 30 ) # 5 gigabytes (GB)

评论

15赞 Will Manley 4/9/2018
这并不能回答这个问题。问题在于查找文件的大小,而不是格式化结果以供人类使用。
2赞 Dre 8/14/2018
这些数字是错误的,因此令人困惑。5GB 是 5e9 字节。这应该是某种人类可读的近似值吗?你甚至会在哪里使用这样的东西?
3赞 James 'Fluffy' Burton 9/12/2018
1 位 = >2 ...2 位 = >4 ...3 位 = >8 ...4 位 = >16 ...5 位 = >32 ...6 位 = >64 ...7 位 = >128 ...8 位 = >256 ...9 位 = >512 ...10 位 = >1024 ...1024 字节是 1kB ... => 20 位 => 1024 * 1024 = 1,048,576 字节,即 1024kB,1MB... => 30 位 => 1024 * 1024 * 1024 = 1,073,741,824 字节,即 1,048,576 kB,以及 1024MB 和 1GB ...您混淆了科学记数法和小数位与计算中使用的二进制/以 2 为底的表示形式。5x9 = 5 x 10^9 = 5,000,000,000
7赞 Mike Williamson 10/3/2018
伙计们,他没有混淆任何东西......他只是给出了一个近似值,当他说“基本上”时很明显。2^10 约为 10^3。事实上,这种近似非常普遍,以至于它有一个名字MebiGibiTebi 分别是 Mega、Giga 和 Tera。关于不回答这个问题,@WillManley,你有一个公平的观点!9-2
-2赞 Jacob 12/10/2018 #8
#Get file size , print it , process it...
#Os.stat will provide the file size in (.st_size) property. 
#The file size will be shown in bytes.

import os

fsize=os.stat('filepath')
print('size:' + fsize.st_size.__str__())

#check if the file size is less than 10 MB

if fsize.st_size < 10000000:
    process it ....
19赞 gunarevuri 4/17/2020 #9

我们有两个选项,都包括导入操作系统模块

1)

import os
os.stat("/path/to/file").st_size

as 函数返回一个对象,其中包含许多标头,包括文件创建时间和上次修改时间等。其中给出了文件的确切大小。 文件路径可以是绝对路径,也可以是相对路径。os.stat()st_size

2) 在这种情况下,我们必须提供确切的文件路径,文件路径可以是相对的,也可以是绝对的。

import os
os.path.getsize("path of file")

评论

1赞 rachid el kedmiri 11/30/2020
os.path.getsize 使用相对路径
1赞 krishnakeshan 8/29/2020 #10

您可以使用模块中的方法。您可以为它提供字符串、字节甚至 PathLike 对象形式的路径。它也适用于文件描述符。stat()os

import os

res = os.stat(filename)

res.st_size # this variable contains the size of the file in bytes
0赞 Mujeeb Ishaque 11/16/2023 #11

这是另一个不言自明的例子。这样,字节将自动转换为 MB、GB 或 TB。

from pathlib import Path
from psutil._common import bytes2human

def get_readable_filesize(text_file: Path):
    return bytes2human(text_file.stat().st_size)

if __name__ == '__main__':
    current_file = Path(__file__).parent.resolve()
    print(get_readable_filesize(current_file / 'file.txt'))