¿Cómo comprobar el tamaño del archivo en python?

Estoy escribiendo un script de Python en Windows. Quiero hacer algo basado en el tamaño del archivo. Por ejemplo, si el tamaño es mayor que 0, enviaré un correo electrónico a alguien, de lo contrario continuaré con otras cosas.

¿Cómo verifico el tamaño del archivo?

Use os.stat y use el miembro st_size del objeto resultante:

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

La salida está en bytes.

Utilizando os.path.getsize :

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

La salida está en bytes.

Las otras respuestas funcionan para archivos reales, pero si necesita algo que funcione para “objetos tipo archivo”, intente esto:

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

Funciona para archivos reales y StringIO, en mis pruebas limitadas. (Python 2.7.3.) La API del “objeto similar a un archivo” no es realmente una interfaz rigurosa, por supuesto, pero la documentación de la API sugiere que los objetos similares a un archivo deberían admitir a seek() y tell() .

Editar

Otra diferencia entre esto y os.stat() es que puede stat() un archivo incluso si no tiene permiso para leerlo. Obviamente, el enfoque de buscar / contar no funcionará a menos que tenga permiso de lectura.

Editar 2

A sugerencia de Jonathon, aquí hay una versión paranoica. (La versión anterior deja el puntero del archivo al final del archivo, por lo que si intentas leer el archivo, obtendrás cero bytes de vuelta).

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

Resultado:

 6.1 MB 

Usando pathlib ( agregado en Python 3.4 o un pathlib disponible en PyPI ):

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

Esta es realmente solo una interfaz alrededor de os.stat , pero el uso de pathlib proporciona una manera fácil de acceder a otras operaciones relacionadas con archivos.

Hay un truco bitshift que utilizo si quiero convertir de bytes a cualquier otra unidad. Si haces un cambio a la derecha en 10 , básicamente lo cambias por un orden (múltiple).

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

Cumpliendo estrictamente la pregunta, el código de Python (+ pseudo-código) sería:

 import os file_path = r"" if os.stat(file_path).st_size > 0:  else:  
 #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 ....