How to check file size in python?

2018-12-31 13:01发布

问题:

I am writing a Python script in Windows. I want to do something based on the file size. For example, if the size is greater than 0, I will send an email to somebody, otherwise continue to other things.

How do I check the file size?

回答1:

Use os.stat, and use the st_size member of the resulting object:

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

Output is in bytes.



回答2:

Using os.path.getsize:

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

The output is in bytes.



回答3:

The other answers work for real files, but if you need something that works for \"file-like objects\", try this:

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

It works for real files and StringIO\'s, in my limited testing. (Python 2.7.3.) The \"file-like object\" API isn\'t really a rigorous interface, of course, but the API documentation suggests that file-like objects should support seek() and tell().

Edit

Another difference between this and os.stat() is that you can stat() a file even if you don\'t have permission to read it. Obviously the seek/tell approach won\'t work unless you have read permission.

Edit 2

At Jonathon\'s suggestion, here\'s a paranoid version. (The version above leaves the file pointer at the end of the file, so if you were to try to read from the file, you\'d get zero bytes back!)

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


回答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)

Result:

6.1 MB


回答5:

Using pathlib (added in Python 3.4 and available on PyPI)...

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

This is really only an interface around os.stat, but using pathlib provides an easy way to access other file related operations.



回答6:

There is a bitshift trick I use if i want to to convert from bytes to any other unit. If you do a right shift by 10 you basically shift it by an order (multiple).

Example: 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)


回答7:

Strictly sticking to the question, the python code (+ pseudo-code) would be:

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>


回答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 ....


标签: python