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

Respostas:

348
>>> import os
>>> os.stat("file").st_size == 0
True
ghostdog74
fonte
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
121
import os    
os.path.getsize(fullpathhere) > 0
Jon
fonte
8
Por segurança, pode ser necessário pegar OSErrore devolver Falso.
Kennytm 24/03
5
Qual é a diferença / vantagem usando este vs os.state ('file'). St_size?
Elijah Lynn
2
Parece que os dois são os mesmos sob o capô: stackoverflow.com/a/18962257/1397061
1 ''
Eu posso aplicá-lo para caminhos de pasta? @Jon
alper 13/04
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
ronedg
fonte
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
Robert King
fonte
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
Ron Klein
fonte
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
MT
fonte
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
Qlimax
fonte
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.

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

KV88
fonte
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()
Rajan Singh
fonte
1
Bem-vindo no estouro de pilha. Melhore sua resposta lendo como escrever uma boa resposta .
Naresh Kumar