¿Cómo verificar si un archivo está vacío o no?

Respuestas:

348
>>> import os
>>> os.stat("file").st_size == 0
True
ghostdog74
fuente
11
stat.ST_SIZEen lugar de 6
wRAR
2
eso también está bien. pero no quiero importar estadísticas. Es lo suficientemente corto y dulce y la posición de tamaño en la lista devuelta no va a cambiar en el corto plazo.
ghostdog74
61
@wRAR: os.stat ('file'). st_size es aún mejor
Daniel Stutzbach
2
Tenga en cuenta que los tipos de archivo también funcionan para json. A veces, json.load () para el archivo vacío no funciona y esto proporciona una buena manera de manejar ese caso
seokhoonlee
¿Qué pasa si el archivo solo contiene nueva línea / vacío? ¡respuesta incorrecta!
lone_coder
121
import os    
os.path.getsize(fullpathhere) > 0
Jon
fuente
8
Por seguridad, es posible que deba atrapar OSErrory devolver False.
kennytm
55
¿Cuál es la diferencia / ventaja usando este vs os.state ('file'). St_size?
Elijah Lynn el
2
Parece que los dos son iguales bajo el capó: stackoverflow.com/a/18962257/1397061
1 ''
¿Puedo aplicar para las rutas de carpetas @ Jon?
Alper
71

Ambos getsize()y stat()lanzarán una excepción si el archivo no existe. Esta función devolverá Verdadero / Falso sin lanzar (más simple pero menos robusto):

import os
def is_non_zero_file(fpath):  
    return os.path.isfile(fpath) and os.path.getsize(fpath) > 0
ronedg
fuente
Definitivamente me gusta usaros.path.getsize()
David Gay
9
Hay una condición de carrera porque el archivo puede eliminarse entre las llamadas os.path.isfile(fpath)y os.path.getsize(fpath), en cuyo caso la función propuesta generará una excepción.
s3rvac
3
Es mejor intentar atraparlo OSError, como se propone en otro comentario .
j08lue
También es necesario detectar TypeErrorcuál se generará en caso de que la entrada fpath sea None.
Trutane
25

si por alguna razón ya tenía el archivo abierto, podría intentar esto:

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

Ok, entonces combinaré la respuesta de ghostdog74 y los comentarios, solo por diversión.

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

False significa un archivo no vacío.

Entonces, escribamos una función:

import os

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

Si está utilizando Python3 pathlib, puede acceder a la os.stat()información utilizando el Path.stat()método, que tiene el atributo st_size(tamaño del archivo en bytes):

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

si tiene el objeto de archivo, entonces

>>> 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
fuente
Esta respuesta debería tener más votos porque realmente verifica si el archivo tiene algún contenido.
amanb
1

Un problema importante: un archivo vacío comprimido parecerá ser distinto de cero cuando se pruebe con getsize()o stat()funciones:

$ 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

Por lo tanto, debe verificar si el archivo que se va a probar está comprimido (por ejemplo, examinar el sufijo del nombre de archivo) y, de ser así, rescatarlo o descomprimirlo en una ubicación temporal, probar el archivo sin comprimir y luego eliminarlo cuando haya terminado.

Trutane
fuente
1

Como no has definido qué es un archivo vacío. Algunos podrían considerar un archivo con solo líneas en blanco y también un archivo vacío. Entonces, si desea verificar si su archivo contiene solo líneas en blanco (cualquier carácter de espacio en blanco, '\ r', '\ n', '\ t') , puede seguir el siguiente ejemplo:

Python3

import re

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

Explique: el ejemplo anterior usa la expresión regular (regex) para que coincida con el contenido ( content) del archivo.
Específicamente: para expresiones regulares de: ^\s*$en su conjunto significa si el archivo contiene solo líneas en blanco y / o espacios en blanco.
- ^afirma la posición al comienzo de una línea
- \scoincide con cualquier carácter de espacio en blanco (igual a [\ r \ n \ t \ f \ v])
- *Cuantificador - Coincide entre cero e ilimitado veces, tantas veces como sea posible, devolviendo según sea necesario ( codicioso)
- $afirma la posición al final de una línea

KV88
fuente
0

si desea comprobar que el archivo csv está vacío o no ... intente esto

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
fuente
1
Bienvenido en el desbordamiento de pila. Mejore su respuesta leyendo cómo escribir una buena respuesta .
Naresh Kumar