Работа с файловыми путями в Python с помощью os.path и pathlib

Раздел: Системное администрирование -> Файловый ввод-вывод

Работа с файловыми путями: os.path и pathlib

Как эффективно манипулировать путями в Python для системного администрирования?

Современным и рекомендуемым решением является модуль pathlib, входящий в стандартную библиотеку начиная с Python 3.4. Он предоставляет объектно-ориентированный интерфейс для работы с путями, что делает код более читаемым и удобным. Основной класс - Path. Ниже приведены ключевые операции.


from pathlib import Path

# Создание объекта пути
p = Path('/home/user/docs/file.txt')
print(p.name)        # file.txt
print(p.stem)        # file
print(p.suffix)      # .txt
print(p.parent)      # /home/user/docs
print(p.parents)     # итератор по родительским каталогам

# Объединение путей
new_path = p.parent / 'newfile.log'
print(new_path)      # /home/user/docs/newfile.log

# Проверки
print(p.exists())    # True/False
print(p.is_file())   # True/False
print(p.is_dir())    # True/False

# Получение абсолютного пути
abs_path = p.resolve()
print(abs_path)

# Создание каталогов
Path('/tmp/test/subdir').mkdir(parents=True, exist_ok=True)

# Чтение и запись файлов
p.write_text('Hello')
content = p.read_text()
  

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

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

  • FileNotFoundError - возникает при попытке создать каталог без parents=True. Решение: добавить параметр.
  • PermissionError - недостаточно прав для доступа. Следует проверять права перед операциями.
  • TypeError - при сложении строки с Path. Используйте оператор / вместо +.

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

Модуль os.path - классический набор функций для работы с путями. До появления pathlib был основным инструментом.


import os

path = '/home/user/docs/file.txt'
print(os.path.splitext(path)[1])  # .txt
print(os.path.basename(path))      # file.txt
print(os.path.dirname(path))       # /home/user/docs
print(os.path.join(path, '..', 'other.txt'))  # объединение

# Нормализация пути
norm = os.path.normpath('/home/./user/../user/docs/file.txt')
print(norm)  # /home/user/docs/file.txt

# Проверка существования
print(os.path.exists(path))
print(os.path.isfile(path))
print(os.path.isdir(path))
  

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

Проблемы:

  • Функции принимают строки, что усложняет композицию.
  • Разные операционные системы (Windows/Linux) требуют особого внимания к разделителям. os.path.join решает эту проблему, но код становится громоздким.
  • Отсутствие методов для создания каталогов - приходится использовать os.makedirs.

Как выполнить обход дерева каталогов?

pathlib предлагает элегантный обход с помощью метода rglob или glob.


from pathlib import Path

base = Path('/tmp/test')
for py_file in base.rglob('*.py'):
    print(py_file)

# Ручной обход
for item in base.iterdir():
    if item.is_dir():
        print(f'Directory: {item}')
  

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

Альтернатива с os.walk:


import os

for root, dirs, files in os.walk('/tmp/test'):
    for f in files:
        if f.endswith('.py'):
            print(os.path.join(root, f))
  

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

Ошибки:

  • В os.walk не рекомендуется изменять список dirs на ходу, это может привести к непредсказуемому поведению.
  • При использовании rglob с большими деревьями учитывайте количество файлов - может снизиться производительность.

Как обработать символические ссылки?

pathlib поддерживает работу с символическими ссылками:


from pathlib import Path

link = Path('/home/user/link_to_docs')
if link.is_symlink():
    target = link.resolve()
    print(f'Link points to {target}')
    # Создание ссылки
    link.symlink_to('/real/path')
  

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

В os.path используется os.readlink и os.islink.

Проблема: на Windows символические ссылки требуют прав администратора. Следует проверять платформу перед созданием.

Как получить временную метку изменения файла?

С pathlib можно получить статистику:


from pathlib import Path
import time

p = Path('/home/user/docs/file.txt')
stat = p.stat()
mtime = stat.st_mtime
print(time.ctime(mtime))
  

Аналог с os.path: os.path.getmtime(path).

- Python copy file (копирование файла в python)
- Python log file (логирование в файл в python)
- Python file methods (методы работы с файлами в python)

Расширенные примеры использования pathlib и os.path

Пример

# Пример 1: переименование файлов по шаблону
from pathlib import Path
import re

dir_path = Path('/tmp/messy')
for file in dir_path.glob('*.txt'):
    new_name = re.sub(r'\s+', '_', file.stem) + file.suffix
    file.rename(file.with_name(new_name))
Результат: файл с пробелами 'my report.txt' станет 'my_report.txt'
Пример

# Пример 2: рекурсивное изменение прав доступа
from pathlib import Path
import os

base = Path('/tmp/test_dir')
for item in base.rglob('*'):
    if item.is_file():
        os.chmod(item, 0o644)
    elif item.is_dir():
        os.chmod(item, 0o755)
Все файлы получат права 644, каталоги - 755.
Пример

# Пример 3: получение относительного пути
from pathlib import Path

base = Path('/home/user')
full = Path('/home/user/docs/file.txt')
rel = full.relative_to(base)
print(rel)  # docs/file.txt
'docs/file.txt'
Пример

# Пример 4: работа с временными файлами через tempfile + pathlib
import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as tmpdir:
    tmp_path = Path(tmpdir)
    (tmp_path / 'data.csv').write_text('a,b,c\n1,2,3')
    content = (tmp_path / 'data.csv').read_text()
    print(content)
a,b,c
1,2,3
Пример

# Пример 5: определение типа файла (блочное устройство, сокет и т.д.)
from pathlib import Path
import stat

p = Path('/dev/sda')
s = p.stat()
print(stat.S_ISBLK(s.st_mode))  # True, если блочное устройство
print(stat.S_ISCHR(s.st_mode))  # символьное устройство
True
False
Пример

# Пример 6: сравнение путей (samefile)
from pathlib import Path

p1 = Path('/home/user/../user/docs/file.txt')
p2 = Path('/home/user/docs/./file.txt')
print(p1.resolve().samefile(p2.resolve()))  # True
True
Пример

# Пример 7: использование os.path.expanduser и expandvars
import os

path = '~/docs/$PROJECT/file.txt'
expanded = os.path.expanduser(os.path.expandvars(path))
print(expanded)  # /home/user/docs/myproject/file.txt (если PROJECT=myproject)
/home/user/docs/myproject/file.txt
Пример

# Пример 8: поиск самого старого файла в каталоге
from pathlib import Path

dir_path = Path('/var/log')
oldest = min(dir_path.glob('*.log'), key=lambda f: f.stat().st_mtime)
print(f'Самый старый файл: {oldest.name}')
Самый старый файл: syslog.1
Пример

# Пример 9: безопасное удаление дерева (shutil + pathlib)
import shutil
from pathlib import Path

p = Path('/tmp/to_delete')
if p.exists():
    shutil.rmtree(str(p))
Каталог /tmp/to_delete удалён.
Пример

# Пример 10: создание цепочки каталогов с временной меткой
from pathlib import Path
from datetime import datetime

now = datetime.now()
base = Path('/tmp/backups')
path = base / str(now.year) / f'{now.month:02d}' / f'{now.day:02d}'
path.mkdir(parents=True, exist_ok=True)
print(path)
/tmp/backups/2025/04/08

Модуль os.path/pathlib в Python - comments

En
модуль path python (python)