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


Respuestas:


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

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


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

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

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

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

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

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.


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


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

1
Bienvenido en el desbordamiento de pila. Mejore su respuesta leyendo cómo escribir una buena respuesta .
Naresh Kumar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.