Python'da dosya boyutunu nasıl kontrol edebilirim?


757

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?


2
Path('./doc.txt').stat().st_size
Boris

Modern Python (v3.4 +) cevabı için teşekkürler @Boris :)
mab

Yanıtlar:


735

Tarafından döndürülen nesneninst_size özelliğine ihtiyacınız var . (Python 3.4+) 'yı kullanarak alabilirsiniz :os.statpathlib

>>> 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.


2
Herhangi bir şey varsa, değer dosya sistemi blok boyutunun katları olarak geçirilebilir (örneğin 4096 bayt). Memnuniyetle, bunun yerine bayt olarak verilir.
josch

1
@josch - evet, bu güzel, "diskteki boyut" stat_result.st_blocksiçin blok boyutuyla çarpabilirsiniz , ancak yine de programlı ve çapraz platform ( tune2fsvb yoluyla değil ) nasıl alacağımı arıyorum
Tomasz Gandor

1097

Kullanma os.path.getsize:

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

Çıktı bayt cinsindendir.


124
Not: uygulanması os.path.getsizesadecereturn os.stat(filename).st_size
wim

Os.stat (dosya) .st_size yerine os.path.getsize kullanıldığında bir dakika performans kaybı var mı?
15'te kelimeler

5
@wordsforthewise ölçün! Bilgisayarımda ~ 150 ns.
Davidmh

@wordsforthewise da bu dosya hakkında başka şeyler (değişiklik zamanı, dosya türü, örneğin) almak istiyorsanız daha bir sorundur - o zaman da hepsini tek bir sistem çağrısından alabilirsiniz os.stat. Sonra fark önemli miktarda mikrosaniye olabilir :-)
greggo

Bir dosya oluşturulduktan hemen sonra çağrılırsa 0 @danben döndürür
alper

131

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)

8
İçe aktarmanız gerekmez os, bunun yerine f.seek(0, 2)sondan 0 bayt aramak için yazın.
cdosborn

2
Ve son satır için, eğer oskullanılmazsa:f.seek(old_file_position, 0)
luckydonald

48
Adlandırılmış değişkenler yerine tamsayı değişmez değerleri kullanırsanız, kodunuzu korumak zorunda olan herkese işkence yaparsınız. İthalat yapmanın zorlayıcı bir nedeni yok os.
Mark E. Haase

Çözüm için teşekkürler, uyguladım ve iyi çalışıyor. Onaylamak için sizeçıktı bayt cinsinden mi?
Kedar.Aitawdekar

3
Görünüşe göre bu, Python'un nasıl uyguladığına bağlı olarak en azından biraz riskli #seek(): wiki.sei.cmu.edu/confluence/display/c/…
Autumnsault

72
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

5
this function will convert bytes to MB.... GB... etcYanlış. Bu fonksiyon Bkz vb MiB, GiB e bayt dönüştürür Bu yayını .
moi

2
Satır 10, return f'{num:.1f} {x}'Python> = 3.5 olarak değiştirilebilir .
Matt M.

53

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 pathlibdiğer dosya ile ilgili işlemlere erişmek için kolay bir yol sağlar.


18

Başka bir birime bitshiftdönüştürmek istersem kullandığım bir numara var bytes. Eğer sağa kaydırma 10yaparsanı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)

9
Bu soruya cevap vermiyor. Soru, insan tüketiminin sonucunu biçimlendirmekle değil, bir dosyanın boyutunu bulmakla ilgilidir.
Will Manley

1
Bu sayılar yanlış ve dolayısıyla kafa karıştırıcı. 5 GB, 5e9 bayttır. Bu bir çeşit insan tarafından okunabilir yaklaşım mıdır? Nerede böyle bir şey bile kullanardın?
Dre

1 bit => 2 ... 2 bit => 4 ... 3 bit => 8 ... 4 bit => 16 ... 5 bit => 32 ... 6 bit => 64 ... 7 bit => 128 ... 8 bit => 256 ... 9 bit => 512 ... 10 bit => 1024 ... 1024 bayt 1kB ... => 20 -bits => 1024 * 1024 = 1.048.576 bayt, yani 1024kB ve 1MB ... => 30-bit => 1024 * 1024 * 1024 = 1.073.741.824 bayt, 1.048.576 kB ve 1024MB ve 1GB… Kafanız karıştı hesaplamada kullanılan ikili / taban-2 gösterimi ile bilimsel gösterim ve ondalık basamaklar. 5x9 = 5 x 10 ^ 9 = 5.000.000.000
James 'Fluffy' Burton

3
Çocuklar, hiçbir şeyi karıştırmadı ... sadece bir yaklaşım verildi, "temelde" dediği zaman belli oluyor. 2 ^ 10 yaklaşık. 10 ^ 3. Aslında, bu yaklaşım o kadar yaygındır : bir adı vardır : Mebi , Gibi ve Tebi sırasıyla Mega, Giga ve Tera. Soruyu cevaplamama konusunda, @WillManley, orada adil bir nokta var! ;-p
Mike Williamson

9

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>

-1
#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 ....

-1

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.