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

时间:2010-01-20 18:58:30

标签: python file

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

如何检查文件大小?

11 个答案:

答案 0 :(得分:944)

使用os.path.getsize

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

输出以字节为单位。

答案 1 :(得分:579)

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

输出以字节为单位。

答案 2 :(得分:113)

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

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

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

修改

这与tell()之间的另一个区别是即使您没有阅读权限,也可以os.stat()一个文件。显然,除非您具有读取权限,否则搜索/告知方法将无效。

修改2

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

stat()

答案 3 :(得分:55)

global start

section .data
    newline:    db  10
    input:      times 256 db  0
    .len:       equ $ - input

    prompt1:    db  'Enter a number: '
    .len:       equ $ - prompt1     ; The difference between the current working address and prompt1's address: the length of prompt1
    prompt2:    db  'Enter another number: '
    .len:       equ $ - prompt2
    resultmsg:  db  'The result is: '
    .len:       equ $ - resultmsg

section .text
start:
    mov     rsi, prompt1            ; Address of message
    mov     rdx, prompt1.len        ; Length of message
    call    print
    call    read
    call    print_newline

    mov     rbx, [input]            ; Store the value of input

    mov     rsi, prompt2
    mov     rdx, prompt2.len
    call    print
    call    read
    call    print_newline

    add     rbx, [input]            ; Add the value of the latest input to the previous one

    mov     rsi, resultmsg
    mov     rdx, resultmsg.len
    call    print

    push    rbx                     ; Push the sum in order to get a pointer to it (in rsp)
    mov     rsi, rsp
    mov     rdx, 8
    call    print
    call    print_newline

    call    exit



print:
    mov     rax, 0x2000004          ; Set command to write string
    mov     rdi, 1                  ; Set output to STDOUT
    syscall                         ; Call kernel
    ret

print_newline:
    mov     rsi, newline
    mov     rdx, 1
    call    print
    ret

read:
    mov     rax, 0x2000003          ; Set command to read string
    mov     rdi, 0                  ; Set input to STDIN
    mov     rsi, input
    mov     rdx, input.len
    syscall
    ret

exit:
    mov     rax, 0x2000001          ; Set command to exit
    mov     rdi, 0                  ; Set exit code to 0 (normal execution)
    syscall

结果:

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)

答案 4 :(得分:24)

使用pathlibadded in Python 3.4PyPI上提供的后端):

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

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

答案 5 :(得分:11)

如果我想从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)

答案 6 :(得分:8)

严格坚持这个问题,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>

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

1) import os, 由于os.stat()函数返回的对象包含很多标头,包括文件创建时间和上次修改时间等。其中st_size提供了文件的确切大小。

os.stat("filename").st_size

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

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

答案 9 :(得分:0)

您可以使用来检查文件大小

import sys
print(sys.getsizeof(your_file))

例如,

nums = range(10000)
squares = [i**2 for i in nums]
print(sys.getsizeof(squares))

答案 10 :(得分:0)

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

import os

res = os.stat(filename)

res.st_size # this variable contains the size of the file in bytes