web-dev-qa-db-fra.com

Comment vérifier la taille du fichier en python?

J'écris un script Python sous 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 courrier électronique à quelqu'un, sinon passez à autre chose 

Comment vérifier la taille du fichier?

585
5YrsLaterDBA

Utilisez os.stat , et utilisez le membre st_size 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.

561
Adam Rosenfield

Utiliser os.path.getsize:

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

La sortie est en octets.

904
danben

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

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

Cela fonctionne pour de vrais fichiers et StringIO, dans mes tests limités. (Python 2.7.3.) L'API "objet de type fichier" n'est certes pas une interface rigoureuse, mais la 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 this et os.stat() est que vous pouvez stat() un fichier même si vous n’avez pas l’autorisation de le lire. Évidemment, l’approche chercher/dire ne fonctionnera que si vous avez la permission de lire.

Edit 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 essayez de lire dans le fichier, vous obtiendrez zéro octet!)

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

Résultat:

6.1 MB
48
Rajiv Sharma

Utiliser pathlib ( ajouté dans Python 3.4 et disponible sur PyPI ) ...

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

Il ne s'agit en réalité que d'une interface autour de os.stat, mais l'utilisation de pathlib permet d'accéder facilement à d'autres opérations liées aux fichiers.

17
pumazi

Il y a une astuce bitshift que j'utilise si je veux convertir bytes en une autre unité. Si vous faites un décalage à droite de 10, vous le déplacez essentiellement d’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)
9
user1767754

S'en tenir strictement à 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
Victor Barrantes
#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 ....
0
Chikku Jacob