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?
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?
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.
Using os.path.getsize
:
>>> import os
>>> b = os.path.getsize(\"/path/isa_005.mp3\")
>>> b
2071611L
The output is in bytes.
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)
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
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.
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)
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>
#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 ....