Як перевірити, чи файл порожній чи ні?


Відповіді:


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

11
stat.ST_SIZEзамість 6
WRAR

2
це теж добре. але я не хочу імпортувати stat. Його короткий і досить солодкий і розмір позиції у поверненому списку не скоро зміниться.
ghostdog74

61
@wRAR: os.stat ('файл'). st_size ще кращий
Даніель Штуцбах,

2
Зауважте, що типи файлів працюють і для json. Іноді json.load () для порожнього файлу не працює, і це дає хороший спосіб впоратися з цим випадком
seokhoonlee

що робити, якщо файл містить лише новий рядок / порожній? неправильну відповідь!
Абдулла Саїд

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

8
Для безпеки вам може знадобитися зловити OSErrorта повернути Неправдиве.
kennytm

5
Яка різниця / перевага використання цього vs os.state ('файла'). 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()
David Gay

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

3
Краще спробувати зловити OSErrorзамість цього, як це запропоновано в іншому коментарі .
j08lue

Також потрібно ловити, TypeErrorщо буде піднято у випадку, якщо вхідний шлях є 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.