Frage Wie überprüft man die Dateigröße in Python?


Ich schreibe ein Python-Skript in Windows. Ich möchte etwas basierend auf der Dateigröße machen. Zum Beispiel, wenn die Größe größer als 0 ist, werde ich eine E-Mail an jemanden senden, ansonsten zu anderen Dingen.

Wie überprüfe ich die Dateigröße?


525
2018-01-20 18:58


Ursprung


Antworten:


Benutzen os.statund benutze die st_size Mitglied des resultierenden Objekts:

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

Die Ausgabe erfolgt in Bytes.


504
2018-01-20 19:01



Verwenden os.path.getsize:

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

Die Ausgabe erfolgt in Bytes.


818
2018-01-20 18:59



Die anderen Antworten funktionieren für echte Dateien, aber wenn Sie etwas benötigen, das für "dateiähnliche Objekte" funktioniert, versuchen Sie Folgendes:

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

Es funktioniert für echte Dateien und StringIOs, in meinen begrenzten Tests. (Python 2.7.3.) Die "dateiähnliche Objekt" API ist natürlich nicht wirklich eine strenge Schnittstelle, aber die API-Dokumentation schlägt vor, dass dateiähnliche Objekte unterstützt werden sollen seek() und tell().

Bearbeiten

Ein weiterer Unterschied zwischen diesem und os.stat() ist das du kannst stat() eine Datei, auch wenn Sie keine Berechtigung zum Lesen haben. Offensichtlich funktioniert der Such- / Tell-Ansatz nur, wenn Sie Leseberechtigung haben.

Bearbeiten 2 

Auf Jonathons Vorschlag folgt hier eine paranoide Version. (Die obige Version lässt den Dateizeiger am Ende der Datei zurück. Wenn Sie also versuchen würden, aus der Datei zu lesen, erhalten Sie null Bytes zurück!)

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

Ergebnis:

6.1 MB

37
2017-10-12 00:22



Verwenden pathlib (hinzugefügt in Python 3.4 und verfügbar auf PyPI) ...

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

Dies ist wirklich nur eine Schnittstelle um os.stat, aber mit pathlib bietet eine einfache Möglichkeit, auf andere dateibezogene Vorgänge zuzugreifen.


11
2017-11-17 17:23



Wenn man sich genau an die Frage hält, wäre der Python-Code (+ Pseudo-Code):

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



Da ist ein bitshift Trick, den ich benutze, wenn ich konvertieren will bytes zu irgendeiner anderen Einheit. Wenn Sie eine Rechtsverschiebung um 10 Sie verschieben es im Grunde um einen Auftrag (mehrfach).

Beispiel: 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