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

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

940167 次浏览

使用#0

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

输出以字节为单位。

您需要#1返回的对象#0属性。您可以使用#2(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_size1564

或使用#0

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

输出以字节为单位。

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

# 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)
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 pathfile_path = r"C:\Windows\System32\mspaint.exe"print file_size(file_path)

结果:

6.1 MB

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

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

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

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

import osfile_path = r"<path to your file>"if os.stat(file_path).st_size > 0:<send an email to somebody>else:<continue to other things>

如果我想从bytes转换到任何其他单位,我使用bitshift技巧。如果你按10右移,你基本上按顺序(多次)移动它。

示例:5GB are 5368709120 bytes

print (5368709120 >> 10)  # 5242880 kilobytes (kB)print (5368709120 >> 20 ) # 5120 megabytes (MB)print (5368709120 >> 30 ) # 5 gigabytes (GB)
#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 ....

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

1)

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

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

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

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

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

import os
res = os.stat(filename)
res.st_size # this variable contains the size of the file in bytes