Определение пустого файла: os.path.getsize и альтернативные подходы

Раздел: Ввод-вывод и файловая система -> Файловый ввод-вывод

Проверка пуст ли файл в Python

При работе с файловой системой часто требуется узнать, содержит ли файл данные. Самый простой и прямой способ - сравнить размер файла с нулём. Рассмотрим основной метод и альтернативные варианты.

Как проверить пуст ли файл с помощью os.path.getsize?

Метод os.path.getsize(path) возвращает размер файла в байтах. Если файл пуст, значение будет равно 0. Пример:

import os

file_path = 'example.txt'
# создадим пустой файл
open(file_path, 'w').close()

if os.path.getsize(file_path) == 0:
    print('Файл пуст')
else:
    print('Файл содержит данные')

ввод программ на python (ввод данных в программе python)

Файл пуст

Python file io (ввод-вывод файлов в python)

Возможные проблемы:

  • Файл не существует - будет исключение FileNotFoundError. Перед вызовом getsize нужно проверить существование через os.path.exists().
  • Директория вместо файла - тоже ошибка (PermissionError или IsADirectoryError). Проверять с помощью os.path.isfile().
  • Проблемы с правами доступа - OSError. Рекомендуется оборачивать код в try/except.
import os

file_path = 'not_exist.txt'
if os.path.exists(file_path) and os.path.isfile(file_path):
    if os.path.getsize(file_path) == 0:
        print('Файл пуст')
else:
    print('Файл не существует или не является файлом')

Python temp files (временные файлы в python)

Как проверить размер файла через os.stat?

Функция os.stat() возвращает подробную информацию о файле, включая поле st_size. Этот метод эффективнее, если уже нужны другие атрибуты файла.

import os

file_path = 'data.txt'
if os.path.exists(file_path):
    stat_info = os.stat(file_path)
    if stat_info.st_size == 0:
        print('Файл пуст')
    else:
        print(f'Размер файла: {stat_info.st_size} байт')

Python index files (индексация файлов в python)

Проблемы:

  • Те же ошибки при отсутствии файла или директории.
  • На некоторых системах вызов stat может быть медленнее getsize, но разница незначительна.

Как использовать pathlib для проверки пустоты файла?

Модуль pathlib предоставляет объектно-ориентированный интерфейс. Метод stat() возвращает объект с полем st_size.

from pathlib import Path

file_path = Path('example.txt')
if file_path.exists() and file_path.is_file():
    if file_path.stat().st_size == 0:
        print('Файл пуст')
    else:
        print('Файл не пуст')

File python class (класс для работы с файлами в python)

Файл пуст

Python file utf 8 (кодировка utf-8 для файлов в python)

Аналогичные ошибки, что и в os.stat. Также возможны проблемы с символическими ссылками - stat() возвращает информацию о цели ссылки, а не о самой ссылке.

Как проверить пуст ли файл через чтение содержимого?

Можно открыть файл и считать его содержимое. Если файл пуст, read() вернёт пустую строку (b'' для бинарного или '' для текстового). Этот способ менее эффективен, так как требует открытия и чтения, но полезен, если нужно одновременно обработать содержимое.

file_path = 'test.txt'
try:
    with open(file_path, 'r') as f:
        content = f.read()
        if content == '':
            print('Файл пуст')
        else:
            print('Файл не пуст')
except FileNotFoundError:
    print('Файл не найден')

Python config files (конфигурационные файлы в python)

Для больших файлов этот метод неэффективен, так как загружает всё содержимое в память. Лучше использовать f.read(1) для проверки только первого байта.

with open(file_path, 'rb') as f:
    if not f.read(1):
        print('Файл пуст')

Python copy file (копирование файла в python)

Как объединить проверку существования и размера?

Для надёжности можно написать функцию, которая возвращает True, если файл существует, является файлом и имеет нулевой размер.

import os
def is_file_empty(file_path):
    if os.path.isfile(file_path):
        return os.path.getsize(file_path) == 0
    return False

print(is_file_empty('test.txt'))  # True или False

Функция корректно обрабатывает случаи отсутствия файла или директории, возвращая False.

- File models in python (модели файлов в python)
- File handle python (обработка файлов в python)
- Python open file read (открытие файла для чтения в python)

Расширенные примеры проверки пустоты файла

Рекурсивная проверка всех файлов в каталоге

Пример
import os

def find_empty_files(root_dir):
    empty_files = []
    for dirpath, dirnames, filenames in os.walk(root_dir):
        for filename in filenames:
            file_path = os.path.join(dirpath, filename)
            try:
                if os.path.getsize(file_path) == 0:
                    empty_files.append(file_path)
            except OSError as e:
                print(f'Ошибка доступа: {file_path} - {e}')
    return empty_files

empty_list = find_empty_files('.')
for f in empty_list:
    print(f'Пустой файл: {f}')
Пустой файл: ./tmp/empty1.txt
Пустой файл: ./tmp/empty2.log

Использование os.fstat для открытого файла

Пример
import os

file_path = 'example.txt'
with open(file_path, 'rb') as f:
    fd = f.fileno()
    stat = os.fstat(fd)
    if stat.st_size == 0:
        print('Файл пуст (через дескриптор)')
    else:
        print(f'Размер: {stat.st_size}')
Файл пуст (через дескриптор)

Этот подход полезен, если файл уже открыт и нужно избежать повторного вызова stat по имени.

Проверка пустоты файла с помощью memory mapping (mmap)

Пример
import mmap
import os

file_path = 'large_empty_file.bin'
try:
    with open(file_path, 'r+b') as f:
        # Попытка создать mmap для пустого файла вызовет ошибку
        try:
            with mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ) as mm:
                print('Файл пуст?', mm.size() == 0)
        except ValueError as e:
            # Пустой файл не может быть отображён
            print('Файл пуст' if os.path.getsize(file_path) == 0 else 'Не пуст')
except FileNotFoundError:
    print('Файл не существует')
Файл пуст

Метод mmap не подходит для пустых файлов, поэтому нужно обрабатывать исключение.

Проверка множества файлов с производительностью

Пример
import os
files = ['a.txt', 'b.txt', 'c.txt']
sizes = {}
for f in files:
    if os.path.isfile(f):
        sizes[f] = os.path.getsize(f)
    else:
        sizes[f] = None

empties = [f for f, s in sizes.items() if s == 0]
print('Пустые файлы:', empties)
Пустые файлы: ['b.txt', 'c.txt']

Такой подход минимизирует число системных вызовов.

Проверка пустоты с помощью модуля glob и pathlib

Пример
from pathlib import Path

for txt_file in Path('.').glob('*.txt'):
    if txt_file.stat().st_size == 0:
        print(f'{txt_file.name} - пустой')
a.txt - пустой
empty.log - пустой

Проверка, пуст ли файл (os.path.getsize == 0) в Python - comments

En
Python file empty (python)