Определение свойств файла с помощью Python

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

Основные методы проверки файлов

Наиболее эффективное и универсальное решение для проверки существования файла - использование модуля pathlib (Python 3.4+) или os.path. Оба подхода работают быстро и поддерживают разные операционные системы.

from pathlib import Path

file_path = Path('example.txt')
if file_path.exists():
    print('Файл существует')
else:
    print('Файл не найден')

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

Метод Path.exists() возвращает True, если файл или директория существуют, иначе False. Аналог из os.path - os.path.exists():

import os

if os.path.exists('example.txt'):
    print('Существует')
else:
    print('Не существует')

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

Типичные ошибки:

  • Передача относительного пути без учёта текущей рабочей директории - файл может быть не найден, хотя фактически он есть. Решение - использовать абсолютные пути или проверять текущую директорию через os.getcwd().
  • Игнорирование регистра в именах файлов на Windows (файловая система не чувствительна к регистру). Path.exists() учитывает это, но в коде лучше сохранять точное имя.

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

from pathlib import Path

p = Path('document.pdf')
if p.is_file():
    print('Это файл')
else:
    print('Это не файл или он не существует')

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

Метод is_file() возвращает True только для обычных файлов, а is_dir() - для директорий.

Ошибка: если файл является символической ссылкой на файл, is_file() вернёт True (ссылка разыменовывается). Если нужно проверить саму ссылку, используйте is_symlink().

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

import os

file = 'secret.txt'
# Проверка на чтение, запись, выполнение
print('Чтение:', os.access(file, os.R_OK))   # True/False
print('Запись:', os.access(file, os.W_OK))
print('Выполнение:', os.access(file, os.X_OK))

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

Функция os.access() использует реальный uid/gid процесса. Однако она подвержена race condition (TOCTOU). Для более надёжной проверки лучше попытаться открыть файл.

Частая проблема: на Windows права на выполнение обычно не имеют смысла для обычных файлов, но os.access всё равно возвращает True. Кроме того, антивирусы могут блокировать доступ.
Как обработать ошибки при открытии файла (проверка без предварительного существования)?
try:
    with open('data.csv', 'r') as f:
        content = f.read()
except FileNotFoundError:
    print('Файл не найден')
except PermissionError:
    print('Нет прав на чтение')
except IsADirectoryError:
    print('Путь указывает на директорию, а не на файл')

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

Этот подход объединяет проверку существования и попытку открытия в один атомарный шаг, избегая race condition.

Ошибка: если файл существует, но повреждён, read() может выбросить исключение IOError или UnicodeDecodeError. Нужно обрабатывать и их.
Как проверить размер файла?
import os

size = os.path.getsize('large_file.bin')
print(f'Размер: {size} байт')

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

Аналог из pathlib: Path.stat().st_size.

Если файл не существует, будет возбуждено исключение FileNotFoundError. Перед вызовом необходимо убедиться в существовании файла.

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

import os

if os.path.getsize('empty.txt') == 0:
    print('Файл пустой')
else:
    print('Файл не пустой')

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

Осторожно: для файлов размером 0 байт, которые на самом деле являются разреженными (sparse), getsize может вернуть 0, хотя фактически данные могут быть - на практике такое встречается редко.

Как проверить тип файла (текстовый или бинарный)?

def is_text_file(filepath, blocksize=512):
    try:
        with open(filepath, 'rb') as f:
            chunk = f.read(blocksize)
        # Проверка наличия нулевого байта
        return b'\x00' not in chunk
    except FileNotFoundError:
        return False

print(is_text_file('readme.txt'))  # True
print(is_text_file('image.png'))   # False

Это эвристический метод: большинство текстовых файлов не содержат нулевых байтов.

Ошибка: некоторые текстовые форматы (например, UTF-16) содержат нулевые байты. Для точного определения требуется анализ заголовка или MIME-типа.
- Python file methods (методы работы с файлами в python)
- File models in python (модели файлов в python)
- File handle python (обработка файлов в python)

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

Получение метаинформации через os.stat

Пример
import os
import stat

file_stat = os.stat('file.txt')
print('Размер:', file_stat.st_size)
print('Инод:', file_stat.st_ino)
print('Количество жёстких ссылок:', file_stat.st_nlink)
print('Время последнего доступа:', file_stat.st_atime)
print('Время последней модификации:', file_stat.st_mtime)
print('Время создания (Windows):', file_stat.st_ctime)

# Проверка прав через битовую маску
mode = file_stat.st_mode
is_reg = stat.S_ISREG(mode)
is_dir = stat.S_ISDIR(mode)
is_sym = stat.S_ISLNK(mode)
print('Обычный файл:', is_reg)
print('Директория:', is_dir)
print('Символическая ссылка:', is_sym)
Размер: 1024
Инод: 1234567
Количество жёстких ссылок: 1
Время последнего доступа: 1700000000.0
Время последней модификации: 1700000100.0
Время создания (Windows): 1700000000.0
Обычный файл: True
Директория: False
Символическая ссылка: False

Работа с символическими ссылками

Проверка на ссылку и получение её цели.

Пример
from pathlib import Path

link = Path('mylink')
if link.is_symlink():
    target = link.resolve()
    print(f'Ссылка ведёт на {target}')
    # Проверить, существует ли цель
    if target.exists():
        print('Цель существует')
    else:
        print('Цель отсутствует')
else:
    print('Не является ссылкой')
Ссылка ведёт на /home/user/real_file.txt
Цель существует

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

Поиск всех файлов определённого расширения и проверка их свойств.

Пример
from pathlib import Path

root = Path('project')
for file in root.rglob('*.py'):
    if file.is_file():
        size = file.stat().st_size
        print(f'{file.name}: {size} байт, изменён {file.stat().st_mtime}')
main.py: 2048 байт, изменён 1700000500.0
utils.py: 512 байт, изменён 1700000400.0

Проверка доступности файла для записи с атомарной попыткой

Избегание race condition через запись временного файла.

Пример
import tempfile
import os

def check_writable(path):
    try:
        with tempfile.NamedTemporaryFile(dir=path, delete=False) as tmp:
            tmp.write(b'test')
            tmp_path = tmp.name
        os.unlink(tmp_path)
        return True
    except (PermissionError, OSError):
        return False

print(check_writable('/tmp'))   # True
print(check_writable('/root'))  # False
True
False

Определение MIME-типа файла через magic

Более точная проверка типа содержимого (требуется установка python-magic).

Пример
import magic

mime = magic.from_file('document.pdf', mime=True)
print('MIME-тип:', mime)  # application/pdf

# Проверка текстовый ли файл
if mime.startswith('text/'):
    print('Текстовый файл')
MIME-тип: application/pdf
Текстовый файл: False

Проверка файла на наличие конкретной строки (сигнатуры) в первых байтах

Пример
def check_signature(filepath, signature):
    with open(filepath, 'rb') as f:
        head = f.read(len(signature))
    return head == signature

# PNG сигнатура: 89 50 4E 47 0D 0A 1A 0A
png_sig = b'\x89PNG\r\n\x1a\n'
if check_signature('image.png', png_sig):
    print('Это PNG файл')
Это PNG файл

Проверка файла Python - comments

En
Python check file (python)