Wie überprüfe ich, ob eine Datei leer ist oder nicht?

Antworten:

348
>>> import os
>>> os.stat("file").st_size == 0
True
Ghostdog74
quelle
11
stat.ST_SIZEstatt 6
wRAR
2
das ist auch gut aber ich möchte stat nicht importieren. Es ist kurz und süß genug und die Größenposition in der zurückgegebenen Liste wird sich nicht so schnell ändern.
Ghostdog74
61
@wRAR: os.stat ('Datei'). st_size ist noch besser
Daniel Stutzbach
2
Beachten Sie, dass die Dateitypen auch für json funktionieren. Manchmal funktioniert json.load () für leere Dateien nicht und dies bietet eine gute Möglichkeit, diesen Fall zu behandeln
seokhoonlee
Was ist, wenn die Datei nur neue Zeile / leer enthält? falsche Antwort!
Abdullah sagte
121
import os    
os.path.getsize(fullpathhere) > 0
Jon
quelle
8
Aus Sicherheitsgründen müssen Sie möglicherweise OSErrorFalse fangen und zurückgeben.
Kennytm
5
Was ist der Unterschied / Vorteil bei dieser Verwendung gegenüber os.state ('Datei'). St_size?
Elijah Lynn
2
Sieht so aus, als wären
1 ''
Kann ich es für Ordnerpfade
anwenden
71

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
ronedg
quelle
Auf jeden Fall wie mitos.path.getsize()
David Gay
9
Es gibt eine Race-Bedingung, da die Datei zwischen den Aufrufen von os.path.isfile(fpath)und entfernt werden os.path.getsize(fpath)kann. In diesem Fall löst die vorgeschlagene Funktion eine Ausnahme aus.
s3rvac
3
Versuchen Sie lieber, das zu fangen OSError, wie in einem anderen Kommentar vorgeschlagen .
j08lue
TypeErrorMüssen auch abfangen, was für den Fall ausgelöst wird, dass der Eingabe-Pfad ist None.
Trutane
25

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
Robert King
quelle
9

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
Ron Klein
quelle
8

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
MT
quelle
4

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
Qlimax
quelle
Diese Antwort sollte mehr Stimmen haben, da sie tatsächlich prüft, ob die Datei überhaupt Inhalt hat.
Amanb
1

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.

Trutane
quelle
1

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
- \sstimmt 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

KV88
quelle
0

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()
Rajan Singh
quelle
1
Willkommen im Stapelüberlauf. Bitte verbessern Sie Ihre Antwort, indem Sie lesen, wie Sie eine gute Antwort schreiben .
Naresh Kumar