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


756

我在Windows中编写Python脚本。我想根据文件大小做一些事情。例如,如果大小大于0,我将向某人发送电子邮件,否则继续其他操作。

如何检查文件大小?


2
Path('./doc.txt').stat().st_size
鲍里斯(Boris)

感谢@Boris提供现代的Python(v3.4 +)答案:)
单克隆抗体

Answers:


734

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

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

输出以字节为单位。


2
如果有的话,该值可以作为文件系统块大小的倍数(例如4096字节)传递。很高兴,它以字节为单位给出。
josch 2016年

1
@josch-是的,这很好,对于“磁盘大小”,您可以乘以stat_result.st_blocks块大小,但是我仍在搜索如何以编程方式和跨平台获取它(而不是通过其他tune2fs方式获取)
Tomasz Gandor

1097

使用os.path.getsize

>>> import os
>>> b = os.path.getsize("/path/isa_005.mp3")
>>> b
2071611

输出以字节为单位。


124
注意:的实现os.path.getsize很简单return os.stat(filename).st_size
2013年

那么,使用os.path.getsize而不是os.stat(file).st_size是否会造成性能的微小损失?
2015年

5
@wordsforthewise衡量一下!我的计算机中大约150 ns。
Davidmh,2015年

@wordsforthewise如果您还想获取有关文件的其他信息(例如修改时间,文件类型),那么这将是一个更大的问题-那么您最好也可以通过单个系统调用来获取所有信息os.stat。然后差异可能会达到相当大的微秒数:-)
greggo,

如果在创建文件后立即调用它,则返回0 @danben
Alper

131

其他答案适用于实际文件,但是如果您需要适用于“类文件的对象”的文件,请尝试以下操作:

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

8
您不需要import os,而是f.seek(0, 2)从末尾写入以查找0个字节。
cdosborn 2015年

2
对于最后一行,如果os不使用的话:f.seek(old_file_position, 0)
luckydonald 2015年

48
如果使用整数文字而不是命名变量,则会折磨任何必须维护代码的人。没有令人信服的理由不进口os
Mark E. Haase 2015年

感谢您的解决方案,我已经实施了,并且工作正常。只是为了确认,size输出是以字节为单位?
Kedar.Aitawdekar,

3
显然,这至少有一点风险,具体取决于Python的实现方式#seek()wiki.sei.cmu.edu/confluence/display/c/…–
Autumnsault,

72
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
this function will convert bytes to MB.... GB... etc错误。此功能会将字节转换为MiB,GiB等。请参见此文章
moi

2
第10行可以return f'{num:.1f} {x}'在Python> = 3.5中更改为。
Matt M.

53

使用pathlib在Python 3.4中添加或在PyPI上提供的反向端口):

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

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


18

bitshift如果要从转换bytes为任何其他单位,有一个技巧。如果您进行右移,则10基本上是按一个顺序(多个)进行移位。

例: 5GB are 5368709120 bytes

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

9
这不能回答问题。问题是关于找到文件的大小,而不是格式化结果供人类使用。
威尔·曼利

1
这些数字是错误的,因此令人困惑。5GB是5e9字节。这应该是某种人类可读的近似值吗?您甚至会在哪里使用这样的东西?
德雷(Dre)'18

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×10 ^ 9 = 50亿
James的蓬松'伯顿

3
伙计们,他什么都没糊涂 ……他只是给出了一个近似值,当他说“基本”时就可以看出这一点。2 ^ 10约为 10 ^ 3。事实上,这种近似是很常见的,它有一个名字MEBI吉比Tebi是兆,千兆,和Tera,分别。关于不回答问题,@ WillManley,您在这里有一个很明确的观点!;-p
Mike Williamson

9

严格遵循这个问题,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>

-1
#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 ....

-1

我们有两个选择都包括导入os模块

1)作为os.stat()函数导入os返回一个对象,该对象包含许多标头,包括文件创建时间和上次修改时间等。其中st_size()给出文件的确切大小。

os.stat(“文件名”).st_size()

2)import os在此,我们必须提供确切的文件路径(绝对路径),而不是相对路径。

os.path.getsize(“文件路径”)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.