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


Réponses:


348
>>> import os
>>> os.stat("file").st_size == 0
True

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

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

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

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

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

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

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é.


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


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()

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.