📖 Теория: Работа с файловой системой

⚡ Кратко

Файловая система — иерархия файлов и папок. Абсолютный путь ведёт от корня диска, относительный — от текущей директории.

Модуль os даёт функции для навигации (getcwd, chdir), проверки (path.exists, path.isfile, path.isdir), создания/удаления (mkdir, makedirs, remove, rmdir) и обхода (walk).

Модуль sys позволяет читать аргументы командной строки через sys.argv и завершать программу через sys.exit.

В современном Python для работы с путями рекомендуется pathlib.Path, но os.path всё ещё встречается в старых проектах.

Что такое файловая система

Файловая система — это способ хранения и организации данных на диске компьютера. Она представляет собой структуру из файлов и папок (директорий), которые можно читать, изменять, удалять или перемещать.

/home/user/
├── PycharmProjects/
│   ├── project1/
│   │   ├── data/
│   │   │   └── file.txt
│   │   └── main.py
│   └── project2/
│       └── main.py
├── documents/
└── downloads/

Абсолютные и относительные пути

Абсолютный путь — полный путь от корневой директории до файла или папки. Он однозначно указывает местоположение объекта независимо от того, откуда запущена программа.

# Linux / macOS
absolute_path = "/home/user/documents/file.txt"

# Windows
absolute_path = "C:\\Users\\User\\Documents\\file.txt"

Относительный путь — путь от текущей рабочей директории. Он удобен, когда скрипт и данные лежат рядом, потому что такой код легко переносить между компьютерами.

# Текущая директория: /home/user/PycharmProjects/project1/data
./file.txt     # /home/user/PycharmProjects/project1/data/file.txt
../file.txt    # /home/user/PycharmProjects/project1/file.txt
ЗнакЗначениеПример
.Текущая директория./file.txt
..Родительская директория../file.txt
/Разделитель в Linux / macOS/home/user/file.txt
\\Разделитель в WindowsC:\\Users\\User\\file.txt
~Домашняя директория (Linux / macOS)~/documents/file.txt

Когда использовать:

  • Абсолютный путь — когда путь фиксирован (конфиги, системные файлы) или нужно работать независимо от текущей директории.
  • Относительный путь — для переносимых скриптов и проектов, где данные лежат рядом с кодом.

Модуль os. Навигация

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

import os

# Текущая рабочая директория
print(os.getcwd())

# Переход в другую директорию
os.chdir("./subdirectory")  # ошибка, если её нет
os.chdir("..")              # на уровень выше

Работа с файлами и директориями

Чтобы проверить, существует ли объект, используйте os.path.exists:

import os

file_path = "example.txt"
if os.path.exists(file_path):
    print(f"Файл '{file_path}' существует.")
else:
    print(f"Файл '{file_path}' не найден.")

Список содержимого директории возвращает os.listdir:

contents = os.listdir(".")
print("Содержимое:", contents)

Создание директорий:

# Одна директория; ошибка, если уже существует
os.mkdir("example_folder")

# Вложенные директории; exist_ok=True подавляет ошибку
os.makedirs("parent_folder/child_folder", exist_ok=True)

Создание пустого файла делается через встроенную функцию open:

open("example.txt", "w").close()

Определение типа объекта:

path = "example.txt"
if os.path.isfile(path):
    print(f"'{path}' — файл.")
elif os.path.isdir(path):
    print(f"'{path}' — директория.")
else:
    print(f"'{path}' не существует.")

Переименование и удаление:

# Переименование файла или папки
os.rename("old_name.txt", "new_name.txt")

# Удаление файла
os.remove("new_name.txt")

# Удаление пустой директории
os.rmdir("empty_folder")

Работа с путями

ФункцияНазначение
os.path.split(path)Разделяет путь на директорию и имя файла
os.path.basename(path)Возвращает имя файла или папки
os.path.dirname(path)Возвращает директорию без имени файла
os.path.abspath(path)Превращает относительный путь в абсолютный
os.path.join(*parts)Соединяет части пути с правильным разделителем
import os

path = "/home/user/docs/file.txt"
print(os.path.dirname(path))   # /home/user/docs
print(os.path.basename(path))  # file.txt
print(os.path.split(path))     # ('/home/user/docs', 'file.txt')

relative = "example.txt"
print(os.path.abspath(relative))

full = os.path.join(os.getcwd(), "docs", "data.txt")
print(full)

Рекурсивный обход директорий

os.walk возвращает корневую директорию, список поддиректорий и список файлов для каждого уровня вложенности:

import os

for root, dirs, files in os.walk("."):
    print(f"Текущая директория: {root}")
    print(f"Поддиректории: {dirs}")
    print(f"Файлы: {files}")
    print("-" * 40)

Модуль sys. Аргументы командной строки

Модуль sys даёт доступ к параметрам интерпретатора. Через sys.argv можно получить аргументы, переданные при запуске скрипта:

import sys

print("Все аргументы:", sys.argv)

if len(sys.argv) > 1:
    print(f"Первый аргумент: {sys.argv[1]}")
else:
    print("Аргументы не переданы.")

Первый элемент sys.argv[0] — это имя запущенного скрипта. Если нужно ровно два аргумента, проверяйте длину и завершайте программу при ошибке:

import sys

if len(sys.argv) != 2:
    print("Использование: python script.py <директория>")
    sys.exit(1)

directory = sys.argv[1]
⚠️ Проверить по документации: для нового кода в современном Python рекомендуется использовать модуль pathlib вместо os.path. pathlib.Path предоставляет объектно-ориентированный интерфейс, поддерживает перегрузку оператора / для построения путей и одинаково работает на Windows, Linux и macOS.

Краткий итог

Модуль os позволяет получать текущую директорию, проверять и создавать папки, разбирать пути и рекурсивно обходить дерево файлов. Модуль sys помогает делать скрипты гибкими за счёт аргументов командной строки. Запомните главное: для сборки путей используйте os.path.join, а в новых проектах — pathlib.Path.