Piszę skrypt w języku Python w systemie Windows. Chcę zrobić coś na podstawie rozmiaru pliku. Na przykład, jeśli rozmiar jest większy niż 0, wyślę do kogoś wiadomość e-mail, w przeciwnym razie przejdź do innych rzeczy.
Jak sprawdzić rozmiar pliku?
Piszę skrypt w języku Python w systemie Windows. Chcę zrobić coś na podstawie rozmiaru pliku. Na przykład, jeśli rozmiar jest większy niż 0, wyślę do kogoś wiadomość e-mail, w przeciwnym razie przejdź do innych rzeczy.
Jak sprawdzić rozmiar pliku?
Odpowiedzi:
Potrzebujesz st_size
właściwości obiektu zwróconego przezos.stat
. Możesz go uzyskać za pomocą pathlib
(Python 3.4+):
>>> from pathlib import Path
>>> Path('somefile.txt').stat()
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> Path('somefile.txt').stat().st_size
1564
lub używając os.stat
:
>>> import os
>>> os.stat('somefile.txt')
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> os.stat('somefile.txt').st_size
1564
Dane wyjściowe są w bajtach.
stat_result.st_blocks
przez rozmiar bloku, ale wciąż szukam, jak uzyskać go programowo i na różnych platformach (nie za pośrednictwem tune2fs
itp.)
Używanie os.path.getsize
:
>>> import os
>>> b = os.path.getsize("/path/isa_005.mp3")
>>> b
2071611
Dane wyjściowe są w bajtach.
os.path.getsize
jest po prostureturn os.stat(filename).st_size
os.stat
. Różnica może wtedy
Inne odpowiedzi działają dla prawdziwych plików, ale jeśli potrzebujesz czegoś, co działa dla „obiektów podobnych do plików”, spróbuj tego:
# f is a file-like object.
f.seek(0, os.SEEK_END)
size = f.tell()
W moich ograniczonych testach działa dla prawdziwych plików i StringIO. (Python 2.7.3.) Interfejs API „obiektopodobny” nie jest tak naprawdę rygorystycznym interfejsem, ale dokumentacja API sugeruje, że obiekty podobne do plików powinny obsługiwać seek()
i tell()
.
Edytować
Kolejna różnica między tym a os.stat()
tym, że możesz stat()
utworzyć plik, nawet jeśli nie masz pozwolenia na jego odczytanie. Oczywiście podejście „szukaj / mów” nie będzie działać, chyba że masz uprawnienia do odczytu.
Edytuj 2
Według sugestii Jonathona, oto wersja paranoiczna. (Powyższa wersja pozostawia wskaźnik pliku na końcu pliku, więc jeśli spróbujesz odczytać z pliku, otrzymasz z powrotem zero bajtów!)
# 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)
os
, zamiast tego napisz, f.seek(0, 2)
aby wyszukać 0 bajtów od końca.
os
nie jest używany:f.seek(old_file_position, 0)
os
.
size
wyjście jest w bajtach?
#seek()
: wiki.sei.cmu.edu/confluence/display/c/…
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)
Wynik:
6.1 MB
return f'{num:.1f} {x}'
w Pythonie> = 3.5.
Za pomocą pathlib
( dodany w Python 3.4 lub backport dostępny w PyPI ):
from pathlib import Path
file = Path() / 'doc.txt' # or Path('./doc.txt')
size = file.stat().st_size
W rzeczywistości jest to tylko interfejs os.stat
, ale korzystanie z niego pathlib
zapewnia łatwy dostęp do innych operacji związanych z plikami.
Jest pewien bitshift
podstęp, którego używam, jeśli chcę przekonwertować z bytes
dowolnej innej jednostki. Jeśli wykonasz właściwą zmianę, 10
po prostu przesuń ją o kolejność (wielokrotność).
Przykład:
5GB are 5368709120 bytes
print (5368709120 >> 10) # 5242880 kilobytes (kB)
print (5368709120 >> 20 ) # 5120 megabytes (MB)
print (5368709120 >> 30 ) # 5 gigabytes (GB)
Ściśle trzymając się pytania, kod Pythona (+ pseudo-kod) to:
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 ....
mamy dwie opcje Obie obejmują importowanie modułu OS
1) import os as funkcja os.stat () zwraca obiekt, który zawiera tak wiele nagłówków, w tym czas utworzenia pliku i czas ostatniej modyfikacji itp. Pośród nich st_size () podaje dokładny rozmiar pliku.
os.stat („nazwa pliku”). st_size ()
2) import os W tym celu musimy podać dokładną ścieżkę do pliku (ścieżkę bezwzględną), a nie ścieżkę względną.
os.path.getsize („ścieżka pliku”)
Path('./doc.txt').stat().st_size