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

Resuelto 5YrsLaterDBA asked hace 14 años • 11 respuestas

¿Cómo obtengo el tamaño de un archivo en Python?

5YrsLaterDBA avatar Jan 21 '10 01:01 5YrsLaterDBA
Aceptado

Usar os.path.getsize:

>>> import os
>>> os.path.getsize("/path/to/file.mp3")
2071611

La salida está en bytes.

danben avatar Jan 20 '2010 18:01 danben

Necesita la st_sizepropiedad del objeto devuelto poros.stat . Puede obtenerlo usando pathlib(Python 3.4+):

>>> from pathlib import Path
>>> Path('somefile.txt').stat()
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> Path('somefile.txt').stat().st_size
1564

o usando os.stat:

>>> import os
>>> os.stat('somefile.txt')
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> os.stat('somefile.txt').st_size
1564

La salida está en bytes.

Adam Rosenfield avatar Jan 20 '2010 19:01 Adam Rosenfield

Las otras respuestas funcionan para archivos reales, pero si necesita algo que funcione para "objetos similares a archivos", 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 de "objetos similares a archivos" no es realmente una interfaz rigurosa, por supuesto, pero la documentación de la API sugiere que los objetos similares a archivos deberían admitir seek()y tell().

Editar

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

Editar 2

Por 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!)

# 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)
Mark E. Haase avatar Sep 29 '2013 15:09 Mark E. Haase
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
Rajiv Sharma avatar Oct 12 '2016 00:10 Rajiv Sharma