Ich schreibe ein Python-Skript in Windows. Ich möchte etwas basierend auf der Dateigröße tun. Wenn die Größe beispielsweise größer als 0 ist, sende ich eine E-Mail an jemanden, andernfalls fahren Sie mit anderen Dingen fort.
Wie überprüfe ich die Dateigröße?
Path('./doc.txt').stat().st_size
Antworten:
Sie benötigen die
st_size
Eigenschaft des von zurückgegebenen Objektsos.stat
. Sie können es entweder mitpathlib
(Python 3.4+) erhalten:oder mit
os.stat
:Die Ausgabe erfolgt in Bytes.
quelle
stat_result.st_blocks
mit der Blockgröße multiplizieren , aber ich suche immer noch, wie ich es programmgesteuert und plattformübergreifend (nicht übertune2fs
usw.)Verwenden von
os.path.getsize
:Die Ausgabe erfolgt in Bytes.
quelle
os.path.getsize
ist einfachreturn os.stat(filename).st_size
os.stat
. Dann könnte der Unterschied eine beträchtliche Anzahl von MikrosekundenDie anderen Antworten funktionieren für echte Dateien. Wenn Sie jedoch etwas benötigen, das für "dateiähnliche Objekte" funktioniert, versuchen Sie Folgendes:
In meinen begrenzten Tests funktioniert es für echte Dateien und StringIOs. (Python 2.7.3.) Die API "dateiähnliches Objekt" ist natürlich keine strenge Schnittstelle, aber die API-Dokumentation schlägt vor, dass dateiähnliche Objekte
seek()
und unterstützen solltentell()
.Bearbeiten
Ein weiterer Unterschied
os.stat()
besteht darin, dass Siestat()
eine Datei auch dann erstellen können, wenn Sie keine Berechtigung zum Lesen haben. Offensichtlich funktioniert der Such- / Tell-Ansatz nur, wenn Sie die Leseberechtigung haben.Bearbeiten 2
Auf Jonathons Vorschlag hin ist hier eine paranoide Version. (In der obigen Version bleibt der Dateizeiger am Ende der Datei. Wenn Sie also versuchen, aus der Datei zu lesen, erhalten Sie null Byte zurück!)
quelle
os
, sondern schreibenf.seek(0, 2)
, um 0 Bytes vom Ende zu suchen.os
nicht verwendet:f.seek(old_file_position, 0)
os
.size
Ausgabe in Bytes?#seek()
: wiki.sei.cmu.edu/confluence/display/c/…Ergebnis:
quelle
this function will convert bytes to MB.... GB... etc
Falsch. Diese Funktion konvertiert Bytes in MiB, GiB usw. Siehe diesen Beitrag .return f'{num:.1f} {x}'
in Python> = 3.5 geändert werden .Verwenden
pathlib
( hinzugefügt in Python 3.4 oder einem auf PyPI verfügbaren Backport ):Dies ist eigentlich nur eine Schnittstelle
os.stat
, aber die Verwendungpathlib
bietet eine einfache Möglichkeit, auf andere dateibezogene Vorgänge zuzugreifen.quelle
Es gibt einen
bitshift
Trick, den ich verwende, wenn ich vonbytes
einer anderen Einheit konvertieren möchte . Wenn Sie eine Rechtsverschiebung durchführen, verschieben10
Sie diese grundsätzlich um eine Reihenfolge (mehrere).quelle
Wenn Sie sich strikt an die Frage halten, lautet der Python-Code (+ Pseudocode):
quelle
quelle
Wir haben zwei Möglichkeiten. Beide beinhalten den Import von OS-Modulen
1) importiere os als os.stat () Funktion gibt ein Objekt zurück, das so viele Header enthält, einschließlich der Erstellungszeit der Datei und der letzten Änderungszeit usw. Unter anderem gibt st_size () die genaue Größe der Datei an.
os.stat ("Dateiname"). st_size ()
2) os importieren Hier müssen wir den genauen Dateipfad (absoluten Pfad) angeben, keinen relativen Pfad.
os.path.getsize ("Pfad der Datei")
quelle