Question Comment vérifier la taille du fichier en python?


J'écris un script Python dans Windows. Je veux faire quelque chose en fonction de la taille du fichier. Par exemple, si la taille est supérieure à 0, je vais envoyer un e-mail à quelqu'un, sinon continuer à d'autres choses.

Comment puis-je vérifier la taille du fichier?


525
2018-01-20 18:58


origine


Réponses:


Utilisation os.stat, et utilisez le st_size membre de l'objet résultant:

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

La sortie est en octets.


504
2018-01-20 19:01



En utilisant os.path.getsize:

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

La sortie est en octets.


818
2018-01-20 18:59



Les autres réponses fonctionnent pour les fichiers réels, mais si vous avez besoin de quelque chose qui fonctionne pour des "objets de type fichier", essayez ceci:

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

Cela fonctionne pour les vrais fichiers et StringIO, dans mes tests limités. (Python 2.7.3.) L'API "object-like object" n'est pas vraiment une interface rigoureuse, bien sûr, mais Documentation de l'API suggère que les objets de type fichier doivent prendre en charge seek() et tell().

modifier

Une autre différence entre ceci et os.stat() c'est que tu peux stat() un fichier même si vous n'êtes pas autorisé à le lire. De toute évidence, l'approche "seek / tell" ne fonctionnera que si vous avez lu la permission.

Modifier 2 

À la suggestion de Jonathon, voici une version paranoïaque. (La version ci-dessus laisse le pointeur de fichier à la fin du fichier, donc si vous deviez essayer de lire à partir du fichier, vous obtiendriez zéro octets!)

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

98
2017-09-29 15:41



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)

Résultat:

6.1 MB

37
2017-10-12 00:22



En utilisant pathlib (ajouté en Python 3.4 et disponible sur PyPI) ...

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

Ceci est vraiment seulement une interface autour os.statmais en utilisant pathlib fournit un moyen facile d'accéder à d'autres opérations liées aux fichiers.


11
2017-11-17 17:23



Strictement coller à la question, le code python (+ pseudo-code) serait:

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>

5
2018-03-14 04:16



Il y a un bitshift astuce que je utilise si je veux convertir à partir de bytes à toute autre unité. Si vous faites un bon décalage en 10 vous le changez fondamentalement par un ordre (multiple).

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

5
2017-12-02 11:04