Come verificare se un file è vuoto o no?


Risposte:


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

11
stat.ST_SIZEinvece di 6
WRAR

2
va bene lo stesso. ma non voglio importare stat. È abbastanza breve e dolce e la posizione delle dimensioni nell'elenco restituito non cambierà presto.
ghostdog74

61
@wRAR: os.stat ('file'). st_size è ancora meglio
Daniel Stutzbach

2
Nota che i tipi di file funzionano anche per json. A volte, json.load () per file vuoto non funziona e questo fornisce un buon modo per gestire quel caso
seokhoonlee

cosa succede se il file contiene solo nuova riga / vuoto? risposta sbagliata!
lone_coder il

121
import os    
os.path.getsize(fullpathhere) > 0

8
Per motivi di sicurezza potrebbe essere necessario catturare OSErrore restituire False.
kennytm,

5
Qual è la differenza / vantaggio usando questo vs os.state ('file'). St_size?
Elijah Lynn,

2
Sembra che i due siano gli stessi sotto il cofano: stackoverflow.com/a/18962257/1397061
1 ''

Posso applicarlo per i percorsi delle cartelle @ Jon?
Alper

71

Entrambi getsize()e stat()genereranno un'eccezione se il file non esiste. Questa funzione restituirà True / False senza lanciare (più semplice ma meno robusto):

import os
def is_non_zero_file(fpath):  
    return os.path.isfile(fpath) and os.path.getsize(fpath) > 0

Sicuramente come usareos.path.getsize()
David Gay il

9
Esiste una condizione di competizione perché il file può essere rimosso tra le chiamate a os.path.isfile(fpath)e os.path.getsize(fpath), nel qual caso la funzione proposta solleverà un'eccezione.
s3rvac,

3
Meglio provare a catturare OSErrorinvece, come proposto in un altro commento .
j08lue,

Inoltre, è necessario catturare ciò TypeErrorche verrà generato nel caso in cui il percorso di input sia None.
Trutane,

25

se per qualche motivo hai già aperto il file potresti provare questo:

>>> 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, unirò la risposta di ghostdog74 e i commenti, solo per divertimento.

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

False indica un file non vuoto.

Quindi scriviamo una funzione:

import os

def file_is_empty(path):
    return os.stat(path).st_size==0

8

Se stai usando Python3 pathlibpuoi accedere alle os.stat()informazioni usando il Path.stat()metodo, che ha l'attributo st_size(dimensione del file in byte):

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

4

se hai l'oggetto file, allora

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

Questa risposta dovrebbe avere più voti perché controlla effettivamente se il file ha qualche contenuto.
amanb

1

Un gotcha importante: un file vuoto compresso apparirà diverso da zero quando testato con getsize()o stat()funzioni:

$ 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

Pertanto, è necessario verificare se il file da testare è compresso (ad esempio esaminare il suffisso del nome file) e, in tal caso, salvarlo o decomprimerlo in una posizione temporanea, testare il file non compresso e quindi eliminarlo al termine.


1

Dal momento che non hai definito cosa sia un file vuoto. Alcuni potrebbero considerare un file con solo righe vuote anche un file vuoto. Quindi, se vuoi controllare se il tuo file contiene solo righe vuote (qualsiasi carattere di spazio, '\ r', '\ n', '\ t') , puoi seguire l'esempio di seguito:

python3

import re

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

Spiega: l'esempio sopra usa l'espressione regolare (regex) per abbinare il contenuto ( content) del file.
In particolare: per regex di: ^\s*$nel suo insieme significa se il file contiene solo righe vuote e / o spazi vuoti.
- ^afferma la posizione all'inizio di una riga
- \scorrisponde a qualsiasi carattere di spazio bianco (uguale a [\ r \ n \ t \ f \ v])
- *Quantificatore - Corrisponde tra zero e un numero illimitato di volte, quante più volte possibile, restituendo quanto necessario ( avido)
- $afferma la posizione alla fine di una riga


0

se vuoi controllare che il file CSV sia vuoto o no ....... prova questo

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
Benvenuto in Stack Overflow. Per favore, migliora la tua risposta leggendo come scrivere una buona risposta .
Naresh Kumar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.