Comment vérifier si un fichier est vide ou non?

Réponses:

348
>>> import os
>>> os.stat("file").st_size == 0
True
ghostdog74
la source
11
stat.ST_SIZEau lieu de 6
wRAR
2
c'est bien aussi. mais je ne veux pas importer de statistiques. Son assez court et doux et la position de la taille dans la liste retournée ne changeront pas de sitôt.
ghostdog74
61
@wRAR: os.stat ('file'). st_size is even better
Daniel Stutzbach
2
Notez que les types de fichiers fonctionnent également pour json. Parfois, json.load () pour un fichier vide ne fonctionne pas et cela fournit un bon moyen de gérer ce cas
seokhoonlee
que faire si le fichier contient uniquement une nouvelle ligne / vide? mauvaise réponse!
lone_coder
121
import os    
os.path.getsize(fullpathhere) > 0
Jon
la source
8
Pour des raisons de sécurité, vous devrez peut-être attraper OSErroret retourner Faux.
kennytm
5
Quelle est la différence / l'avantage en utilisant ce vs os.state («fichier»). St_size?
Elijah Lynn,
2
On dirait que les deux sont les mêmes sous le capot: stackoverflow.com/a/18962257/1397061
1 ''
Puis-je l'appliquer pour les chemins de dossier? @Jon
alper
71

Les deux getsize()et stat()lèveront une exception si le fichier n'existe pas. Cette fonction retournera True / False sans lancer (plus simple mais moins robuste):

import os
def is_non_zero_file(fpath):  
    return os.path.isfile(fpath) and os.path.getsize(fpath) > 0
ronedg
la source
Certainement comme utiliseros.path.getsize()
David Gay
9
Il existe une condition de concurrence critique car le fichier peut être supprimé entre les appels à os.path.isfile(fpath)et os.path.getsize(fpath), auquel cas la fonction proposée déclenche une exception.
s3rvac
3
Mieux vaut essayer d'attraper le OSErrorplutôt, comme proposé dans un autre commentaire .
j08lue
Vous devez également capturer TypeErrorce qui sera augmenté dans le cas où le fpath d'entrée est None.
Trutane
25

si pour une raison quelconque vous aviez déjà ouvert le fichier, vous pouvez essayer ceci:

>>> 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
la source
9

Ok donc je vais combiner la réponse de ghostdog74 et les commentaires, juste pour le plaisir.

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

False signifie un fichier non vide.

Écrivons donc une fonction:

import os

def file_is_empty(path):
    return os.stat(path).st_size==0
Ron Klein
la source
8

Si vous utilisez Python3 avec, pathlibvous pouvez accéder aux os.stat()informations à l'aide de la Path.stat()méthode, qui a l'attribut st_size(taille du fichier en octets):

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

si vous avez l'objet fichier, alors

>>> 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
la source
Cette réponse devrait avoir plus de votes car elle vérifie réellement si le fichier a du contenu.
amanb
1

Un piège important: un fichier vide compressé apparaîtra non nul lorsqu'il est testé avec getsize()ou stat()fonctionne:

$ 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

Vous devez donc vérifier si le fichier à tester est compressé (par exemple, examinez le suffixe du nom de fichier) et si c'est le cas, libérez-le ou décompressez-le dans un emplacement temporaire, testez le fichier non compressé, puis supprimez-le une fois terminé.

Trutane
la source
1

Puisque vous n'avez pas défini ce qu'est un fichier vide. Certains pourraient considérer un fichier avec des lignes vides comme un fichier vide. Donc, si vous voulez vérifier si votre fichier ne contient que des lignes vides (n'importe quel caractère d'espacement, '\ r', '\ n', '\ t') , vous pouvez suivre l'exemple ci-dessous:

Python3

import re

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

Expliquez: l'exemple ci-dessus utilise une expression régulière (regex) pour faire correspondre le contenu ( content) du fichier.
Plus précisément: pour l'expression régulière de: ^\s*$dans son ensemble signifie que le fichier ne contient que des lignes vides et / ou des espaces vides.
- ^affirme la position au début d'une ligne
- \scorrespond à tout caractère d'espacement (égal à [\ r \ n \ t \ f \ v])
- *Quantificateur - Correspond entre zéro et un nombre illimité de fois, autant de fois que possible, en redonnant au besoin ( gourmand)
- $affirme sa position à la fin d'une ligne

KV88
la source
0

si vous voulez vérifier que le fichier csv est vide ou non ....... essayez ceci

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
la source
1
Bienvenue dans le débordement de la pile. Veuillez améliorer votre réponse en lisant comment rédiger une bonne réponse .
Naresh Kumar