Пути к файлам в Python: от основ до продвинутых приёмов
Основные подходы к построению путей
Самый современный и рекомендуемый способ работы с путями - модуль pathlib, появившийся в Python 3.4. Он предоставляет объектно-ориентированный интерфейс, автоматически подстраивающийся под текущую операционную систему.
from pathlib import Path
# Создание пути к файлу в текущей папке
file_path = Path('data') / 'input.txt'
print(file_path) # data/input.txt (на Windows data\input.txt)
# Абсолютный путь
home = Path.home() / 'documents' / 'report.csv'
print(home) # /home/user/documents/report.csv (или C:\Users\...)ввод программ на python (ввод данных в программе python)
Объект Path можно преобразовать в строку через str(), но чаще всего он используется напрямую для операций чтения/записи.
Типичные ошибки:
- Забыть про экранирование обратных слешей в Windows при использовании обычных строк - решение: использовать сырые строки (r'...') или pathlib.
- Смешивание прямых и обратных слешей - pathlib сам выбирает правильный разделитель.
Как задать путь, который будет работать на любой ОС?
Использование os.path.join - классический способ, который склеивает части с правильным разделителем.
import os
path = os.path.join('data', 'subfolder', 'file.txt')
print(path)Python file io (ввод-вывод файлов в python)
На Windows получится data\subfolder\file.txt, на Linux и macOS - data/subfolder/file.txt. os.path остаётся актуальным для старых проектов.
Проблема: os.path не предоставляет удобных методов для обхода директорий или работы с относительными путями. Для этого лучше использовать pathlib.
Как указать путь к файлу в той же папке, что и скрипт?
Получить абсолютный путь к текущему исполняемому файлу через __file__ и взять его родительскую директорию.
from pathlib import Path
script_dir = Path(__file__).parent
config_path = script_dir / 'config.ini'
print(config_path)Python temp files (временные файлы в python)
Аналогично с os.path:
import os
script_dir = os.path.dirname(os.path.abspath(__file__))
config_path = os.path.join(script_dir, 'config.ini')Python index files (индексация файлов в python)
Как использовать относительные пути и преобразовывать их в абсолютные?
Метод resolve() у Path превращает относительный путь в абсолютный, разрешая симлинки.
rel = Path('../docs/../data/file.txt')
abs_path = rel.resolve()
print(abs_path) # выведет нормализованный путьFile python class (класс для работы с файлами в python)
В os.path для этого есть os.path.abspath и os.path.normpath.
Ошибка: передача некорректного пути (например, несуществующего) - resolve() не проверяет существование, только строит путь. Для проверки используйте .exists().
Как получить расширение файла, имя без расширения, родительскую папку?
Атрибуты объекта Path:
p = Path('archive.tar.gz')
print(p.suffix) # .gz
print(p.suffixes) # ['.tar', '.gz']
print(p.stem) # archive.tar
print(p.name) # archive.tar.gz
print(p.parent) # .Python file utf 8 (кодировка utf-8 для файлов в python)
С os.path:
import os
base = os.path.basename('folder/file.txt')
ext = os.path.splitext(base)[1]
name = os.path.splitext(base)[0]Расширенные примеры работы с путями
1. Обход всех файлов в директории с фильтрацией по расширению
from pathlib import Path
start = Path('./documents')
for py_file in start.rglob('*.py'):
print(py_file.name)main.py utils.py test.py
2. Создание вложенных папок и запись файла
from pathlib import Path
p = Path('output/2025/april/report.txt')
p.parent.mkdir(parents=True, exist_ok=True)
p.write_text('Hello', encoding='utf-8')3. Проверка существования и типа объекта (файл/папка/симлинк)
p = Path('config.json')
if p.exists():
if p.is_file():
print('Это файл')
elif p.is_dir():
print('Это папка')
if p.is_symlink():
print('Это ссылка')4. Получение времени последнего изменения и размера файла
from datetime import datetime
p = Path('data.csv')
if p.exists():
mtime = datetime.fromtimestamp(p.stat().st_mtime)
size = p.stat().st_size
print(f'Изменён: {mtime}, размер: {size} байт')Изменён: 2025-03-15 12:30:45, размер: 1024 байт
5. Работа с путями с помощью raw-строк для Windows
import os
# Сырая строка избавляет от экранирования обратных слешей
path = r'C:\Users\Alex\My Documents\file.txt'
if os.path.exists(path):
print('Файл найден')
# Альтернатива: замена слешей
path2 = 'C:/Users/Alex/My Documents/file.txt'
os.path.normpath(path2) # нормализует под платформу6. Использование временных путей с модулем tempfile
from tempfile import NamedTemporaryFile
with NamedTemporaryFile(suffix='.txt', delete=False) as tmp:
tmp.write(b'temporary data')
temp_path = tmp.name
print(temp_path) # например /tmp/tmpabc123.txt
Path(temp_path).unlink() # удалить вручную7. Получение путей из переменных окружения
from pathlib import Path
import os
home = Path.home()
cache_dir = home / '.cache'
# или через os.environ
appdata = Path(os.environ.get('APPDATA', '')) # только Windows
print(appdata)8. Сравнение путей (проверка, что два пути указывают на одно и то же)
from pathlib import Path
p1 = Path('data/./file.txt')
p2 = Path('data/file.txt')
print(p1.resolve() == p2.resolve()) # True после нормализации9. Путь к домашней директории текущего пользователя
from pathlib import Path
home = Path.home()
desktop = home / 'Desktop'
print(f'Рабочий стол: {desktop}')10. Преобразование относительного пути в URL (для веб-серверов)
from pathlib import Path
p = Path('static/images/photo.jpg')
url = p.as_posix() # всегда использует прямые слеши
print(url) # static/images/photo.jpg