Bir dosyanın boş olup olmadığını nasıl kontrol edebilirim?


Yanıtlar:


348
>>> import os
>>> os.stat("file").st_size == 0
True

11
stat.ST_SIZEyerine 6
wRAR

2
bu da iyi. ama stat almak istemiyorum. Kısa ve yeterince tatlı ve iade edilen listedeki boyut konumu yakında değişmeyecek.
ghostdog74

61
@wRAR: os.stat ('file').
st_size

2
Dosya türlerinin json için de çalıştığını unutmayın. Bazen, boş dosya için json.load () işe yaramaz ve bu durumla başa çıkmak için iyi bir yol sağlar
seokhoonlee

dosya yalnızca yeni satır / boş içeriyorsa ne olur? yanlış cevap!
lone_coder


71

Her ikisi de getsize()ve stat()dosya yoksa bir istisna atar. Bu işlev fırlatmadan Doğru / Yanlış döndürür (daha basit ama daha az sağlam):

import os
def is_non_zero_file(fpath):  
    return os.path.isfile(fpath) and os.path.getsize(fpath) > 0

Kesinlikle kullanmak gibios.path.getsize()
David Gay

9
Dosya için çağrılar arasında kaldırılmış olabilir çünkü bir yarış durumu vardır os.path.isfile(fpath)ve os.path.getsize(fpath)teklif edilen fonksiyon bir istisna bu durumda.
s3rvac

3
OSErrorBunun yerine denemek ve yakalamak daha iyi , başka bir yorumda önerildiği gibi .
j08lue

Ayrıca TypeErrorgiriş fpath olması durumunda yükseltilecek yakalamak gerekir None.
Trutane

25

bir nedenden dolayı dosyayı zaten açık tuttuysanız şunu deneyebilirsiniz:

>>> with open('New Text Document.txt') as my_file:
...     # I already have file open at this point.. now what?
...     my_file.seek(0) #ensure you're at the start of the file..
...     first_char = my_file.read(1) #get the first character
...     if not first_char:
...         print "file is empty" #first character is the empty string..
...     else:
...         my_file.seek(0) #first character wasn't empty, return to start of file.
...         #use file now
...
file is empty

9

Tamam, ben sadece eğlenmek için ghostdog74 cevap ve yorumları birleştireceğim .

>>> import os
>>> os.stat('c:/pagefile.sys').st_size==0
False

False boş olmayan bir dosya anlamına gelir.

Şimdi bir fonksiyon yazalım:

import os

def file_is_empty(path):
    return os.stat(path).st_size==0

8

Python3'ü kullanıyorsanız , özelliğe (bayt cinsinden dosya boyutu) sahip olan yöntemi kullanarak bilgilere pathliberişebilirsiniz :os.stat()Path.stat()st_size

>>> from pathlib import Path 
>>> mypath = Path("path/to/my/file")
>>> mypath.stat().st_size == 0 # True if empty

4

dosya nesneniz varsa, o zaman

>>> import os
>>> with open('new_file.txt') as my_file:
...     my_file.seek(0, os.SEEK_END) # go to end of file
...     if my_file.tell(): # if current position is truish (i.e != 0)
...         my_file.seek(0) # rewind the file for later use 
...     else:
...         print "file is empty"
... 
file is empty

Bu yanıtın daha fazla oyu olmalıdır, çünkü aslında dosyanın hiç içeriğinin olup olmadığını kontrol eder.
amanb

1

Önemli bir gotcha: sıkıştırılmış boş bir dosya , test edildiğinde getsize()veya stat()işlevlerle sıfırlandığında sıfırdan farklı görünecektir :

$ python
>>> import os
>>> os.path.getsize('empty-file.txt.gz')
35
>>> os.stat("empty-file.txt.gz").st_size == 0
False

$ gzip -cd empty-file.txt.gz | wc
0 0 0

Bu nedenle, test edilecek dosyanın sıkıştırılıp sıkıştırılmadığını (örn. Dosya adı sonekini inceleyin) kontrol etmeli ve eğer öyleyse, geçici bir konuma kefaletle veya sıkıştırmayı açmalı, sıkıştırılmamış dosyayı test etmeli ve bittiğinde silmelisiniz.


1

Boş bir dosyanın ne olduğunu tanımlamadığınız için. Bazıları sadece boş satırları olan bir dosyayı da boş bir dosya olarak düşünebilir. Dolayısıyla dosyanızda yalnızca boş satırlar (boşluk karakteri, '\ r', '\ n', '\ t') olup olmadığını kontrol etmek istiyorsanız, aşağıdaki örneği takip edebilirsiniz:

Python3

import re

def whitespace_only(file):
    content = open(file, 'r').read()
    if re.search(r'^\s*$', content):
        return True

Açıklayın: yukarıdaki örnek content, dosyanın içeriğini ( ) eşleştirmek için normal ifade (normal ifade) kullanır .
Özellikle: for regex için: ^\s*$bir bütün olarak dosya sadece boş satırlar ve / veya boş alanlar içeriyorsa anlamına gelir.
- ^bir satırın başlangıcındaki konumu belirtir
- \sherhangi bir boşluk karakteriyle eşleşir ([\ r \ n \ t \ f \ v] değerine eşit)
- *Nicelik belirteci - Sıfır ve sınırsız kez, mümkün olduğunca çok kez eşleşir , mümkün olduğunca geri verir ( açgözlü)
- $satırın sonundaki konumu belirtir


0

csv dosyasının boş olup olmadığını kontrol etmek istiyorsanız ....... bunu deneyin

with open('file.csv','a',newline='') as f:
        csv_writer=DictWriter(f,fieldnames=['user_name','user_age','user_email','user_gender','user_type','user_check'])
        if os.stat('file.csv').st_size > 0:
            pass
        else:
            csv_writer.writeheader()

1
Yığın taşmasına hoş geldiniz. Lütfen iyi bir cevap yazmayı okuyarak cevabınızı geliştirin .
Naresh Kumar
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.