Mam plik tekstowy.
Jak mogę sprawdzić, czy jest pusty, czy nie?
Mam plik tekstowy.
Jak mogę sprawdzić, czy jest pusty, czy nie?
Odpowiedzi:
>>> import os
>>> os.stat("file").st_size == 0
True
import os
os.path.getsize(fullpathhere) > 0
OSError
i zwrócenie False.
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
os.path.getsize()
os.path.isfile(fpath)
i os.path.getsize(fpath)
, w którym to przypadku proponowana funkcja zgłosi wyjątek.
OSError
zamiast tego, jak zaproponowano w innym komentarzu .
TypeError
który zostanie podniesiony w przypadku, gdy wejściowa fpath jest None
.
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
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
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
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
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.
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
- \s
dopasowuje 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
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()
stat.ST_SIZE
zamiast 6