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?
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.
Utiliser os.path.getsize
:
>>> import os
>>> b = os.path.getsize("/path/isa_005.mp3")
>>> b
2071611L
La sortie est en octets.
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)
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
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.
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)
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>
#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 ....