Пути к файлам в 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]
- Python log file (логирование в файл в python)
- Python file methods (методы работы с файлами в python)
- File models in python (модели файлов в python)

Расширенные примеры работы с путями

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

Путь к файлу в Python - comments

En
Python file path (python)