Как проверить, пуст файл или нет?


Ответы:


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

11
stat.ST_SIZEвместо 6
wRAR

2
это тоже хорошо. но я не хочу импортировать стат. Он достаточно короткий и приятный, а позиция размера в возвращаемом списке не изменится в ближайшее время.
ghostdog74

61
@wRAR: os.stat ('file'). st_size еще лучше
Даниэль Штутцбах

2
Обратите внимание, что типы файлов также работают для json. Иногда, json.load () для пустого файла не работает, и это обеспечивает хороший способ справиться с этим делом
seokhoonlee

Что делать, если файл содержит только новую строку / пусто? неправильный ответ!
lone_coder

121
import os    
os.path.getsize(fullpathhere) > 0

8
В целях безопасности вам может понадобиться поймать OSErrorи вернуть False.
Kennytm

5
В чем разница / преимущество использования этого vs os.state ('file'). St_size?
Элайджа Линн

2
Похоже, что под капотом они одинаковы: stackoverflow.com/a/18962257/1397061
1 ''

Могу ли я применять его для путей к папкам? @ Джон
ALPER

71

Оба getsize()и stat()сгенерируют исключение, если файл не существует. Эта функция вернет True / False без броска (проще, но менее надежно):

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

Определенно нравится использоватьos.path.getsize()
Дэвид Гей

9
Существует условие состязания, поскольку файл может быть удален между вызовами os.path.isfile(fpath)и os.path.getsize(fpath), и в этом случае предложенная функция вызовет исключение.
s3rvac

3
Лучше попытаться поймать OSErrorвместо этого, как предложено в другом комментарии .
j08lue

Также нужно отлавливать, TypeErrorчто будет повышено в случае, если входной fpath есть None.
Трутэн

25

если по какой-то причине у вас уже был открыт файл, вы можете попробовать это:

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

Итак, я объединю ответ ghostdog74 и комментарии, просто для удовольствия.

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

False означает непустой файл.

Итак, давайте напишем функцию:

import os

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

8

Если вы используете Python3, pathlibвы можете получить доступ к os.stat()информации с помощью Path.stat()метода, который имеет атрибут st_size(размер файла в байтах):

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

4

если у вас есть файл объекта, то

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

Этот ответ должен иметь больше голосов, поскольку он фактически проверяет, есть ли в файле какое-либо содержимое.
Аманб

1

Важное замечание: сжатый пустой файл будет отличен от нуля при тестировании с использованием функций getsize()или stat():

$ 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

Таким образом, вы должны проверить, сжат ли проверяемый файл (например, проверить суффикс имени файла), и если это так, либо освободить его или распаковать во временное место, протестировать несжатый файл, а затем удалить его, когда закончите.


1

Поскольку вы не определили, что такое пустой файл. Некоторые могут считать файл с пустыми строками также пустым файлом. Поэтому, если вы хотите проверить, содержит ли ваш файл только пустые строки (любые пробельные символы, '\ r', '\ n', '\ t') , вы можете следовать примеру ниже:

python3

import re

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

Объясните: в приведенном выше примере регулярное выражение (регулярное выражение) используется для сопоставления содержимого ( content) файла.
В частности: для регулярного выражения: ^\s*$в целом означает, что файл содержит только пустые строки и / или пробелы.
- ^устанавливает позицию в начале строки
- \sсоответствует любому символу пробела (равному [\ r \ n \ t \ f \ v])
- *Квантификатор - Сопоставляет от нуля до неограниченного числа раз, столько раз, сколько возможно, возвращая при необходимости ( жадный)
- $устанавливает положение в конце строки


0

если вы хотите проверить, что CSV-файл пуст или нет ....... попробуйте это

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
Добро пожаловать в переполнение стека. Пожалуйста, улучшите свой ответ, прочитав, как написать хороший ответ .
Нареш Кумар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.