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