Como verificar se um arquivo está vazio ou não?


Respostas:


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

11
stat.ST_SIZEem vez de 6
wRAR

2
tudo bem também. mas eu não quero importar stat. Sua curta e doce o suficiente e a posição do tamanho na lista retornada não será alterada tão cedo.
ghostdog74

61
. @wRAR: os.stat ( 'file') st_size é ainda melhor
Daniel Stutzbach

2
Observe que os tipos de arquivo também funcionam para json. Às vezes, json.load () para arquivo vazio não funciona e isso proporciona uma boa maneira de lidar com esse caso
seokhoonlee

e se o arquivo contiver apenas nova linha / vazio? resposta errada!
lone_coder


71

Ambos getsize()e stat()lançarão uma exceção se o arquivo não existir. Esta função retornará True / False sem lançar (mais simples, mas menos robusta):

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

Definitivamente como usaros.path.getsize()
David Gay

9
Há uma condição de corrida porque o arquivo pode ser removido entre as chamadas para os.path.isfile(fpath)e os.path.getsize(fpath), nesse caso, a função proposta gerará uma exceção.
S3rvac

3
Melhor tentar pegar o OSErrorlugar, como proposto em outro comentário .
J08lue 4/17

Também é necessário pegar o TypeErrorque será gerado no caso em que o caminho de entrada seja None.
Trutane 19/09/19

25

se por algum motivo você já tinha o arquivo aberto, poderia tentar o seguinte:

>>> 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, então eu vou combinar a resposta de ghostdog74 e os comentários, apenas por diversão.

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

False significa um arquivo não vazio.

Então, vamos escrever uma função:

import os

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

8

Se você estiver usando Python3, pathlibpoderá acessar os.stat()informações usando o Path.stat()método, que possui o atributo st_size(tamanho do arquivo em bytes):

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

4

se você tiver o objeto file, então

>>> 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 resposta deve ter mais votos, porque na verdade verifica se o arquivo tem algum conteúdo.
19419 amanb

1

Uma dica importante: um arquivo vazio compactado parecerá diferente de zero quando testado com getsize()ou stat()funções:

$ 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

Portanto, você deve verificar se o arquivo a ser testado está compactado (por exemplo, examinar o sufixo do nome do arquivo) e, se for o caso, liberar ou descompactá-lo para um local temporário, testar o arquivo descompactado e excluí-lo quando terminar.


1

Como você não definiu o que é um arquivo vazio. Alguns podem considerar um arquivo com apenas linhas em branco e também um arquivo vazio. Portanto, se você quiser verificar se seu arquivo contém apenas linhas em branco (qualquer caractere de espaço em branco, '\ r', '\ n', '\ t') , siga o exemplo abaixo:

Python3

import re

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

Explique: o exemplo acima usa expressão regular (regex) para corresponder ao conteúdo ( content) do arquivo.
Especificamente: para regex de: ^\s*$como um todo significa se o arquivo contém apenas linhas em branco e / ou espaços em branco.
- ^afirma posição no início de uma linha
- \scorresponde a qualquer caractere de espaço em branco (igual a [\ r \ n \ t \ f \ v])
- *Quantificador - Corresponde entre zero e ilimitado vezes, quantas vezes for possível, retornando conforme necessário ( ganancioso)
- $afirma a posição no final de uma linha


0

se você deseja verificar se o arquivo csv está vazio ou não ... tente isso

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
Bem-vindo no estouro de pilha. Melhore sua resposta lendo como escrever uma boa resposta .
Naresh Kumar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.