""" Урок 50. Работа с файловой системой — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/50-file-system/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-50.py """ # ==================================================================== # Пример 1. Текущая рабочая директория # ==================================================================== import os from pathlib import Path print(os.getcwd()) print(Path.cwd()) print(type(Path.cwd())) # C:\Users\...\lesson50-demo # C:\Users\...\lesson50-demo # # ==================================================================== # Пример 2. Проверка существования и типа объекта # ==================================================================== from pathlib import Path note = Path("lesson50_example2.txt") note.write_text("demo", encoding="utf-8") print(note.exists()) # True print(note.is_file()) # True print(note.is_dir()) # False print(Path("lesson50_example2_missing.txt").exists()) # False note.unlink() # удаляем файл — убираем за собой print(note.exists()) # False # ==================================================================== # Пример 3. Создание и удаление файлов и папок # ==================================================================== from pathlib import Path project_dir = Path("lesson50_example3_project") project_dir.mkdir(parents=True, exist_ok=True) # создаст и родителей, не упадёт, если уже есть config_file = project_dir / "config.txt" config_file.write_text("debug = True\n", encoding="utf-8") print(list(project_dir.iterdir())) # [WindowsPath('lesson50_example3_project/config.txt')] config_file.unlink() # сначала файл project_dir.rmdir() # потом пустую папку print(project_dir.exists()) # False # ==================================================================== # Пример 4. Содержимое директории # ==================================================================== import os from pathlib import Path demo_dir = Path("lesson50_example4_dir") demo_dir.mkdir() (demo_dir / "a.txt").write_text("a", encoding="utf-8") (demo_dir / "b.txt").write_text("b", encoding="utf-8") (demo_dir / "sub").mkdir() print(os.listdir(demo_dir)) # ['a.txt', 'b.txt', 'sub'] for item in sorted(demo_dir.iterdir()): label = "папка" if item.is_dir() else "файл" print(f" {label}: {item.name}") # файл: a.txt # файл: b.txt # папка: sub (demo_dir / "a.txt").unlink() (demo_dir / "b.txt").unlink() (demo_dir / "sub").rmdir() demo_dir.rmdir() # ==================================================================== # Пример 5. Платформонезависимая сборка путей # ==================================================================== import os from pathlib import Path base = Path("lesson50_example5_dir") base.mkdir() data_path = base / "data" / "input.txt" print(data_path) # lesson50_example5_dir\data\input.txt same_as_string = os.path.join(str(base), "data", "input.txt") print(same_as_string) # lesson50_example5_dir\data\input.txt print(str(data_path) == same_as_string) # True base.rmdir() # ==================================================================== # Пример 6. Имя, расширение и родитель пути # ==================================================================== from pathlib import Path import os report = Path("reports") / "2026" / "sales_january.CSV" print(report.name) # sales_january.CSV print(report.stem) # sales_january print(report.suffix) # .CSV print(report.parent) # reports\2026 path_str = str(report) print(os.path.basename(path_str)) # sales_january.CSV print(os.path.splitext(path_str)) # ('reports\\2026\\sales_january', '.CSV') # ==================================================================== # Пример 7. Рекурсивный обход дерева директорий # ==================================================================== import os from pathlib import Path root_dir = Path("lesson50_example7_root") (root_dir / "sub").mkdir(parents=True) (root_dir / "notes.txt").write_text("root", encoding="utf-8") (root_dir / "sub" / "data.txt").write_text("sub", encoding="utf-8") (root_dir / "sub" / "image.png").write_text("fake", encoding="utf-8") # pathlib: один вызов с маской имени txt_files = sorted(root_dir.rglob("*.txt")) for path in txt_files: print(path) # lesson50_example7_root\notes.txt # lesson50_example7_root\sub\data.txt # os.walk: даёт (root, dirs, files) на каждом уровне — больше контроля, больше кода found = [] for current_dir, subdirs, files in os.walk(root_dir): for file_name in files: if file_name.endswith(".txt"): found.append(os.path.join(current_dir, file_name)) print(sorted(found)) # ['lesson50_example7_root\\notes.txt', 'lesson50_example7_root\\sub\\data.txt'] (root_dir / "notes.txt").unlink() (root_dir / "sub" / "data.txt").unlink() (root_dir / "sub" / "image.png").unlink() (root_dir / "sub").rmdir() root_dir.rmdir() # ==================================================================== # Пример 8. Обработка ошибок файловой системы # ==================================================================== from pathlib import Path # FileNotFoundError — читаем несуществующий файл try: Path("lesson50_example8_missing.txt").read_text(encoding="utf-8") except FileNotFoundError as error: print(f"Файл не найден: {error}") # Файл не найден: [Errno 2] No such file or directory: 'lesson50_example8_missing.txt' # FileExistsError — создаём папку, которая уже есть, без exist_ok demo_err_dir = Path("lesson50_example8_dir") demo_err_dir.mkdir() try: demo_err_dir.mkdir() except FileExistsError as error: print(f"Папка уже существует: {error}") # Папка уже существует: [WinError 183] Невозможно создать файл, так как он # уже существует: 'lesson50_example8_dir' # PermissionError — пытаемся записать в путь, который на самом деле папка try: demo_err_dir.write_text("x", encoding="utf-8") except PermissionError as error: print(f"Permission denied: {error}") except IsADirectoryError as error: print(f"Is a directory: {error}") # Permission denied: [Errno 13] Permission denied: 'lesson50_example8_dir' demo_err_dir.rmdir() # ==================================================================== # Пример 9. shutil: копирование и перемещение # ==================================================================== import shutil from pathlib import Path source_dir = Path("lesson50_example9_source") source_dir.mkdir() (source_dir / "report.txt").write_text("data", encoding="utf-8") backup_dir = Path("lesson50_example9_backup") shutil.copytree(source_dir, backup_dir) # рекурсивно копирует папку со всем содержимым print(sorted(p.name for p in backup_dir.iterdir())) # ['report.txt'] moved_dir = Path("lesson50_example9_moved") shutil.move(str(backup_dir), str(moved_dir)) # переименование/перемещение папки print(backup_dir.exists(), moved_dir.exists()) # False True shutil.rmtree(source_dir) # рекурсивное удаление, даже если папка не пуста shutil.rmtree(moved_dir) # ==================================================================== # Пример 10. Скрипт для командной строки: sys.argv + pathlib # ==================================================================== import sys from pathlib import Path # В реальном запуске аргумент приходит от ОС: python check_directory.py mydir # Здесь подставляем его вручную, чтобы пример можно было выполнить сразу: sys.argv = ["check_directory.py", "lesson50_example10_dir"] cli_dir = Path("lesson50_example10_dir") cli_dir.mkdir() (cli_dir / "report.txt").write_text("data", encoding="utf-8") if len(sys.argv) != 2: print("Использование: python check_directory.py <директория>") else: target = Path(sys.argv[1]) if not target.is_dir(): print(f"Директория '{target}' не найдена.") else: print(f"Содержимое '{target}':") for item in sorted(target.iterdir()): label = "папка" if item.is_dir() else "файл" print(f" {label}: {item.name}") # Содержимое 'lesson50_example10_dir': # файл: report.txt (cli_dir / "report.txt").unlink() cli_dir.rmdir()