Windows'ta bir Python betiği yazıyorum. Dosya boyutuna göre bir şey yapmak istiyorum. Örneğin, boyut 0'dan büyükse, birine bir e-posta göndereceğim, aksi takdirde başka şeylere devam edeceğim.
Dosya boyutunu nasıl kontrol ederim?
Windows'ta bir Python betiği yazıyorum. Dosya boyutuna göre bir şey yapmak istiyorum. Örneğin, boyut 0'dan büyükse, birine bir e-posta göndereceğim, aksi takdirde başka şeylere devam edeceğim.
Dosya boyutunu nasıl kontrol ederim?
Yanıtlar:
Tarafından döndürülen nesneninst_size
özelliğine ihtiyacınız var . (Python 3.4+) 'yı kullanarak alabilirsiniz :os.stat
pathlib
>>> 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
veya kullanarak 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
Çıktı bayt cinsindendir.
stat_result.st_blocks
için blok boyutuyla çarpabilirsiniz , ancak yine de programlı ve çapraz platform ( tune2fs
vb yoluyla değil ) nasıl alacağımı arıyorum
Kullanma os.path.getsize
:
>>> import os
>>> b = os.path.getsize("/path/isa_005.mp3")
>>> b
2071611
Çıktı bayt cinsindendir.
os.path.getsize
sadecereturn os.stat(filename).st_size
os.stat
. Sonra fark önemli miktarda mikrosaniye olabilir :-)
Diğer yanıtlar gerçek dosyalar için geçerlidir, ancak "dosya benzeri nesneler" için çalışan bir şeye ihtiyacınız varsa şunu deneyin:
# f is a file-like object.
f.seek(0, os.SEEK_END)
size = f.tell()
Sınırlı testlerimde gerçek dosyalar ve StringIO'lar için çalışıyor. (Python 2.7.3.) "Dosya benzeri nesne" API'si elbette çok titiz bir arayüz değil, ancak API dokümantasyonu dosya benzeri nesnelerin seek()
ve öğelerini desteklemesi gerektiğini gösteriyor tell()
.
Düzenle
Bu ve arasındaki diğer bir fark os.stat()
, stat()
dosyayı okuma izniniz olmasa bile bir dosya yapabilmenizdir. Açıkçası, arama / söyleme yaklaşımı okuma izniniz olmadığı sürece çalışmaz.
Düzenle 2
Jonathon'un önerisine göre, paranoyak bir versiyon. (Yukarıdaki sürüm, dosya işaretçisini dosyanın sonunda bırakır, bu nedenle dosyadan okumaya çalışırsanız sıfır bayt geri alırsınız!)
# 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
, bunun yerine f.seek(0, 2)
sondan 0 bayt aramak için yazın.
os
kullanılmazsa:f.seek(old_file_position, 0)
os
.
size
çıktı bayt cinsinden mi?
#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)
Sonuç:
6.1 MB
return f'{num:.1f} {x}'
Python> = 3.5 olarak değiştirilebilir .
Kullanılması pathlib
( Python 3.4 eklenen veya bir backport mevcut PyPI ):
from pathlib import Path
file = Path() / 'doc.txt' # or Path('./doc.txt')
size = file.stat().st_size
Bu gerçekten sadece bir arayüz os.stat
, ancak kullanmak pathlib
diğer dosya ile ilgili işlemlere erişmek için kolay bir yol sağlar.
Başka bir birime bitshift
dönüştürmek istersem kullandığım bir numara var bytes
. Eğer sağa kaydırma 10
yaparsanız, temelde bir sıraya (çoklu) kaydırırsınız.
Misal:
5GB are 5368709120 bytes
print (5368709120 >> 10) # 5242880 kilobytes (kB)
print (5368709120 >> 20 ) # 5120 megabytes (MB)
print (5368709120 >> 30 ) # 5 gigabytes (GB)
Soruya sıkı sıkıya bağlı kalmak, Python kodu (+ sözde kod):
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 ....
iki seçeneğimiz var Her ikisi de os modülünü içe aktarmayı içerir
1) os dosyasını os.stat () işlevi olarak içe aktar, dosya oluşturma zamanı ve son değiştirilme zamanı vb. Dahil çok fazla başlık içeren bir nesne döndürür. Aralarında st_size () dosyanın tam boyutunu verir.
os.stat ( "dosya adı"). st_size ()
2) import os Burada, göreceli bir yol değil, tam dosya yolunu (mutlak yol) sağlamalıyız.
os.path.getsize ("dosya yolu")
Path('./doc.txt').stat().st_size