Jak sprawdzić, czy plik jest pusty, czy nie?

Odpowiedzi:

348
>>> import os
>>> os.stat("file").st_size == 0
True
ghostdog74
źródło
11
stat.ST_SIZEzamiast 6
wRAR
2
to też w porządku. ale nie chcę importować statystyk. Jest wystarczająco krótki i słodki, a pozycja wielkości na liście zwrotnej nie zmieni się w najbliższym czasie.
ghostdog74
61
@wRAR: os.stat ('file'). st_size jest jeszcze lepszy
Daniel Stutzbach
2
Zauważ, że typy plików działają również dla json. Czasami json.load () dla pustego pliku nie działa, a to zapewnia dobry sposób na
poradzenie
co jeśli plik zawiera tylko nowy wiersz / pusty? zła odpowiedź!
Abdullah Powiedział
121
import os    
os.path.getsize(fullpathhere) > 0
Jon
źródło
8
Dla bezpieczeństwa może być konieczne złapanie OSErrori zwrócenie False.
kennytm
5
Jaka jest różnica / korzyść przy użyciu tego vs os.state ('file'). St_size?
Elijah Lynn
2
Wygląda na to, że oba są takie same pod maską: stackoverflow.com/a/18962257/1397061
1 ''
Czy mogę zastosować go do ścieżki folderu @Jon?
Alper
71

Zarówno getsize()i stat()wyrzuci wyjątek, jeśli plik nie istnieje. Ta funkcja zwróci True / False bez rzucania (prostsze, ale mniej niezawodne):

import os
def is_non_zero_file(fpath):  
    return os.path.isfile(fpath) and os.path.getsize(fpath) > 0
ronedg
źródło
Zdecydowanie lubię używaćos.path.getsize()
David Gay
9
Występuje warunek wyścigu, ponieważ plik może zostać usunięty między wywołaniami os.path.isfile(fpath)i os.path.getsize(fpath), w którym to przypadku proponowana funkcja zgłosi wyjątek.
s3rvac
3
Lepiej spróbować złapać OSErrorzamiast tego, jak zaproponowano w innym komentarzu .
j08lue
Trzeba także złapać, TypeErrorktóry zostanie podniesiony w przypadku, gdy wejściowa fpath jest None.
Trutane
25

jeśli z jakiegoś powodu masz już otwarty plik, możesz spróbować:

>>> 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
Robert King
źródło
9

Ok, więc dla zabawy połączę odpowiedź ghostdog74 i komentarze.

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

False oznacza niepusty plik.

Napiszmy więc funkcję:

import os

def file_is_empty(path):
    return os.stat(path).st_size==0
Ron Klein
źródło
8

Jeśli używasz Pythona 3 pathlib, możesz uzyskać dostęp do os.stat()informacji za pomocą Path.stat()metody, która ma atrybut st_size(rozmiar pliku w bajtach):

>>> from pathlib import Path 
>>> mypath = Path("path/to/my/file")
>>> mypath.stat().st_size == 0 # True if empty
MT
źródło
4

jeśli masz obiekt pliku, to

>>> 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
Qlimax
źródło
Ta odpowiedź powinna mieć więcej głosów, ponieważ faktycznie sprawdza, czy plik ma jakąkolwiek zawartość.
amanb
1

Ważna uwaga: skompresowany pusty plik będzie wyglądał na niezerowy podczas testowania za pomocą funkcji getsize()lub stat():

$ 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

Powinieneś więc sprawdzić, czy plik do przetestowania jest skompresowany (np. Zbadać przyrostek nazwy pliku), a jeśli tak, to zwolnij go za kaucją lub zdekompresuj do tymczasowej lokalizacji, przetestuj nieskompresowany plik, a następnie usuń po zakończeniu.

Trutan
źródło
1

Ponieważ nie zdefiniowałeś, co to jest pusty plik. Niektórzy mogą uznać plik z pustymi liniami za pusty plik. Więc jeśli chcesz sprawdzić, czy plik zawiera tylko puste wiersze (dowolny biały znak, „\ r”, „\ n”, „\ t”) , możesz postępować zgodnie z poniższym przykładem:

Python3

import re

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

Wyjaśnij: w powyższym przykładzie zastosowano wyrażenie regularne (regex) w celu dopasowania zawartości ( content) pliku.
W szczególności: dla wyrażenia regularnego: ^\s*$jako całość oznacza, że ​​plik zawiera tylko puste linie i / lub puste spacje.
- ^zapewnia pozycję na początku linii
- \sdopasowuje dowolny znak spacji (równy [\ r \ n \ t \ f \ v])
- *kwantyfikator - dopasowuje od zera do nieograniczonej liczby razy, tyle razy, ile to możliwe, zwracając w razie potrzeby ( chciwy)
- $zapewnia pozycję na końcu linii

KV88
źródło
0

jeśli chcesz sprawdzić, czy plik csv jest pusty, czy nie ....... spróbuj tego

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()
Rajan Singh
źródło
1
Witamy w przepełnieniu stosu. Popraw swoją odpowiedź, czytając, jak napisać dobrą odpowiedź .
Naresh Kumar