Определение свойств файла с помощью 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() - для директорий.
Как проверить права доступа к файлу?
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). Для более надёжной проверки лучше попытаться открыть файл.
Как обработать ошибки при открытии файла (проверка без предварительного существования)?
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.
Как проверить размер файла?
import os
size = os.path.getsize('large_file.bin')
print(f'Размер: {size} байт')Python file utf 8 (кодировка utf-8 для файлов в python)
Аналог из pathlib: Path.stat().st_size.
Как проверить, пуст ли файл?
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Это эвристический метод: большинство текстовых файлов не содержат нулевых байтов.
Расширенные примеры проверки файлов
Получение метаинформации через 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')) # FalseTrue 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 файл