Ich habe eine Textdatei.
Wie kann ich überprüfen, ob es leer ist oder nicht?
Ich habe eine Textdatei.
Wie kann ich überprüfen, ob es leer ist oder nicht?
Antworten:
>>> import os
>>> os.stat("file").st_size == 0
True
import os
os.path.getsize(fullpathhere) > 0
OSError
False fangen und zurückgeben.
Beide getsize()
und stat()
lösen eine Ausnahme aus, wenn die Datei nicht vorhanden ist. Diese Funktion gibt True / False zurück, ohne zu werfen (einfacher, aber weniger robust):
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)
und entfernt werden os.path.getsize(fpath)
kann. In diesem Fall löst die vorgeschlagene Funktion eine Ausnahme aus.
OSError
, wie in einem anderen Kommentar vorgeschlagen .
TypeError
Müssen auch abfangen, was für den Fall ausgelöst wird, dass der Eingabe-Pfad ist None
.
Wenn Sie die Datei aus irgendeinem Grund bereits geöffnet hatten, können Sie Folgendes versuchen:
>>> 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, also werde ich die Antwort von ghostdog74 und die Kommentare nur zum Spaß kombinieren .
>>> import os
>>> os.stat('c:/pagefile.sys').st_size==0
False
False
bedeutet eine nicht leere Datei.
Schreiben wir also eine Funktion:
import os
def file_is_empty(path):
return os.stat(path).st_size==0
Wenn Sie Python3 mit verwenden pathlib
, können Sie os.stat()
mithilfe der Path.stat()
Methode mit dem Attribut st_size
(Dateigröße in Byte) auf Informationen zugreifen :
>>> from pathlib import Path
>>> mypath = Path("path/to/my/file")
>>> mypath.stat().st_size == 0 # True if empty
Wenn Sie das Dateiobjekt haben, dann
>>> 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
Ein wichtiger Punkt: Eine komprimierte leere Datei scheint beim Testen mit getsize()
oder mit stat()
Funktionen wie folgt ungleich Null zu sein :
$ 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
Sie sollten daher prüfen, ob die zu testende Datei komprimiert ist (z. B. das Dateinamensuffix überprüfen). Wenn dies der Fall ist, können Sie sie entweder sichern oder an einen temporären Speicherort dekomprimieren, die nicht komprimierte Datei testen und anschließend löschen.
Da hast du nicht definiert was eine leere Datei ist. Einige betrachten eine Datei mit nur leeren Zeilen möglicherweise auch als leere Datei. Wenn Sie also überprüfen möchten, ob Ihre Datei nur Leerzeilen enthält (ein Leerzeichen, '\ r', '\ n', '\ t') , können Sie dem folgenden Beispiel folgen:
Python3
import re
def whitespace_only(file):
content = open(file, 'r').read()
if re.search(r'^\s*$', content):
return True
Erklären Sie: Im obigen Beispiel wird ein regulärer Ausdruck (Regex) verwendet, um dem Inhalt ( content
) der Datei zu entsprechen.
Insbesondere bedeutet: für Regex von: ^\s*$
als Ganzes, wenn die Datei nur Leerzeilen und / oder Leerzeichen enthält.
- setzt die ^
Position am Zeilenanfang fest
- \s
stimmt mit einem beliebigen Leerzeichen überein (entspricht [\ r \ n \ t \ f \ v])
- *
Quantifizierer - Stimmt so oft wie möglich zwischen null und unbegrenzt überein und gibt bei Bedarf etwas zurück ( gierig)
- $
behauptet die Position am Ende einer Zeile
Wenn Sie überprüfen möchten, ob die CSV-Datei leer ist oder nicht, versuchen Sie dies
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
statt 6