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

5Yr*_*DBA 684 python file

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

如何检查文件大小?

dan*_*ben 1018

使用os.path.getsize:

>>> import os
>>> b = os.path.getsize("/path/isa_005.mp3")
>>> b
2071611L
Run Code Online (Sandbox Code Playgroud)

输出以字节为单位.

  • 但是,哦,比`st_size`更清楚了! (250认同)
  • 注意:`os.path.getsize`的实现只是`return os.stat(filename).st_size` (109认同)
  • @wordsforthewise,如果您还想获取有关文件的其他信息(修改时间、文件类型等),那么这就是一个更大的问题——那么您不妨通过“os.stat”从单个系统调用中获取所有信息。那么差异可能会达到相当多的微秒:-) (6认同)
  • @wordsforthewise测量它!我的电脑约150 ns. (5认同)
  • 然后除以 1e+6 即可得到文件大小(以 MB 为单位),例如:output/1e+6 (5认同)
  • @wordsforthewise所以它是2071611L字节还是2071611L MB?L代表什么?请告诉我我是File I/O的新手 (2认同)
  • 文档说:os.path.getsize(path):返回路径的大小(以字节为单位)。https://docs.python.org/2/library/os.path.html忽略L:http://stackoverflow.com/questions/12589976/os-path-getsize-reports-a-filesize-with-an我到底为什么 (2认同)

Ada*_*eld 644

使用os.stat,并使用st_size结果对象的成员:

>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
Run Code Online (Sandbox Code Playgroud)

输出以字节为单位.

  • @josch - 是的,这很好,对于“磁盘上的大小”,您可以将 `stat_result.st_blocks` 乘以块大小,但我仍在搜索如何以编程方式和跨平台获取它(不是通过 `tune2fs` ETC。) (3认同)
  • 如果有的话,该值可以作为文件系统块大小的倍数传递(例如4096字节).很高兴,它以字节为单位. (2认同)
  • @TomaszGandor 现在 `st_blocks` 被定义为“为文件分配的 512 字节块的数量”,因此您不必获取块大小。 (2认同)

Mar*_*ase 124

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

# f is a file-like object. 
f.seek(0, os.SEEK_END)
size = f.tell()
Run Code Online (Sandbox Code Playgroud)

在我的有限测试中,它适用于真实文件和StringIO.(Python 2.7.3.)当然,"类文件对象"API并不是一个严格的界面,但是API文档建议类文件对象应该支持seek()tell().

编辑

另一个区别os.stat()是,stat()即使您没有阅读权限,也可以使用文件.显然,除非您具有读取权限,否则搜索/告知方法将不起作用.

编辑2

在Jonathon的建议中,这是一个偏执的版本.(上面的版本将文件指针留在文件的末尾,所以如果你试图从文件中读取,你将得到零字节!)

# 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)
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用整数文字而不是命名变量,你就会折磨任何必须维护代码的人.没有令人信服的理由不导入`os`. (44认同)
  • 你不需要导入`os`,而是写`f.seek(0,2)`来从末尾寻找0字节. (6认同)
  • 显然,这至少有一点风险,具体取决于Python如何实现#seek():https://wiki.sei.cmu.edu/confluence/display/c/FIO19-C.+Do+not+use+ fseek%28%29 + and + ftell%28%29 +可以计算+ a +常规文件的大小 (3认同)
  • 对于最后一行,如果没有使用```os```:````f.seek(old_file_position,0)``` (2认同)

Raj*_*rma 67

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)
Run Code Online (Sandbox Code Playgroud)

结果:

6.1 MB
Run Code Online (Sandbox Code Playgroud)

  • `这个函数会将字节转换为MB .... GB ... etc`错误.此函数将字节转换为MiB,GiB等.请参阅[this post](https://superuser.com/a/1077275/174299). (5认同)
  • 在Python&gt; = 3.5中,第10行可以更改为`return f'{num:.1f} {x}'`。 (2认同)

pum*_*azi 36

使用pathlib(在Python 3.4中添加并在PyPI上可用)......

from pathlib import Path
file = Path() / 'doc.txt'  # or Path('./doc.txt')
size = file.stat().st_size
Run Code Online (Sandbox Code Playgroud)

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


gun*_*uri 19

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

1)

import os
os.stat("/path/to/file").st_size
Run Code Online (Sandbox Code Playgroud)

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

2)在此,我们必须提供准确的文件路径,文件路径可以是相对路径或绝对路径。

import os
os.path.getsize("path of file")
Run Code Online (Sandbox Code Playgroud)


use*_*754 13

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

例: 5GB are 5368709120 bytes

print (5368709120 >> 10)  # 5242880 kilo Bytes (kB)
print (5368709120 >> 20 ) # 5120 Mega Bytes(MB)
print (5368709120 >> 30 ) # 5 Giga Bytes(GB)
Run Code Online (Sandbox Code Playgroud)

  • 这不回答这个问题.问题是找到文件的大小,而不是格式化人类消费的结果. (5认同)
  • 1 位=&gt;2 ... 2 位=&gt;4 ... 3 位=&gt;8 ... 4 位=&gt;16 ... 5 位=&gt;32 ... 6 位=&gt; 64 ... 7 位=&gt;128 ... 8 位=&gt;256 ... 9 位=&gt;512 ... 10 位=&gt;1024 ... 1024 字节为 1kB ... =&gt; 20 -bits =&gt; 1024 * 1024 = 1,048,576bytes,即1024kB和1MB... =&gt; 30-bits =&gt; 1024 * 1024 * 1024 = 1,073,741,824 bytes,即1,048,576 kB,1024MB和1GB ...你混淆了科学记数法和小数位以及计算中使用的二进制/基数 2 表示形式。5x9 = 5 x 10^9 = 5,000,000,000 (3认同)
  • 伙计们,他没有*混淆*任何东西……他只是给出了一个近似值,这在他说“基本上”时很明显。2^10 大约是。10^3。事实上,这种近似非常普遍以至于[它有一个名字](https://en.wikipedia.org/wiki/Mebibyte):*Mebi*、*Gibi* 和 *Tebi* 是 Mega、Giga 和 Tera , 分别。关于不回答这个问题,@WillManley ,你有一个公平的观点!;-p (3认同)
  • 这些数字是错误的,因此令人困惑。5GB 是 5e9 字节。这应该是某种人类可读的近似值吗?你会在哪里使用这样的东西? (2认同)

Vic*_*tes 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>
Run Code Online (Sandbox Code Playgroud)