Работа с операционной и файловой системой в Python. Pathlib, os, shutil

Работа с файлами и операционной системой

Работа с операционной системой и файлами имеет широкий спектр практических применений. Например:

  1. Управление файлами и директориями:
    • Создание, перемещение, переименование и удаление файлов и директорий.
    • Навигация по файловой системе для поиска и обработки нужных данных.
  2. Обработка данных из файлов:
    • Чтение и запись данных из/в текстовые файлы, CSV, JSON и другие форматы.
    • Обработка больших объемов данных, например, в лог-файлах.
  3. Автоматизация задач:
    • Автоматизация повседневных задач, таких как переименование множества файлов по определенному шаблону.
    • Пакетная обработка файлов, например, изменение размера изображений.
  4. Системное администрирование:
    • Изменение конфигурационных файлов и настройка системных параметров.
    • Мониторинг состояния файловой системы и ресурсов компьютера.
  5. Взаимодействие с операционной системой:
    • Запуск внешних программ и команд из скриптов.
    • Работа с переменными окружения и другими системными ресурсами.
  6. Обеспечение безопасности данных:
    • Шифрование и дешифрование файлов.
    • Управление правами доступа к файлам и директориям.
  7. Работа с базами данных:
    • Импорт и экспорт данных из и в базы данных.
    • Архивация и резервное копирование данных.
  8. Разработка веб-приложений:
    • Загрузка, сохранение и обработка файлов, отправленных пользователями.
    • Чтение и запись данных в файловую систему, кэширование данных.

Библиотеки и модули Python, для работы с операционной системой и файлами.

  1. Модуль os и os.path:
    • os: Предоставляет функции для взаимодействия с операционной системой.
    • os.path: Предоставляет функции для работы с путями к файлам и директориям.
  2. Модуль pathlib:
    • Предоставляет объектно-ориентированный интерфейс для работы с путями к файлам и директориям.
  3. Модуль shutil:
    • Позволяет выполнить различные операции с файлами, включая копирование, перемещение и удаление.
  4. Модуль glob:
    • Позволяет использовать шаблоны для поиска файлов в директориях.
  5. Модуль subprocess:
    • Предоставляет возможность запуска внешних процессов и выполнения команд в командной строке.
  6. Библиотека os.environ:
    • Позволяет взаимодействовать с переменными окружения операционной системы.
  7. Библиотека fileinput:
    • Упрощает обработку текстовых файлов в потоковом режиме.
  8. Библиотека csv:
    • Предоставляет функциональность для работы с файлами в формате CSV (Comma-Separated Values).
  9. Библиотека json:
    • Позволяет кодировать и декодировать данные в формате JSON.
  10. Библиотека sqlite3:
    • Интегрированная библиотека для работы с базой данных SQLite.
  11. Библиотека gzip и zipfile:
    • Позволяют работать с сжатыми файлами в форматах Gzip и Zip соответственно.
  12. Библиотека hashlib:
    • Предоставляет интерфейс для работы с хеш-функциями, полезен для контроля целостности файлов.
  13. Библиотека pathvalidate:
    • Позволяет валидировать и нормализовать пути файлов и директорий.
  14. Библиотека openpyxl и pandas:
    • Предоставляют возможности для работы с файлами Excel, как для чтения, так и для записи данных.

Модуль os

Основные функции для работы с файловой системой

  1. os.getcwd():
    • Получение текущей рабочей директории.
      import os
      
      current_directory = os.getcwd()
      print(f"Текущая директория: {current_directory}")
      
  2. os.chdir(path):
    • Изменение текущей директории.
      import os
      
      new_directory = "/путь/к/новой/директории"
      os.chdir(new_directory)
      
  3. os.listdir(path='.'):
    • Получение списка файлов и директорий в указанной директории.
      import os
      
      files_in_directory = os.listdir("/путь/к/директории")
      print(f"Список файлов и директорий: {files_in_directory}")
      
  4. os.mkdir(path):
    • Создание новой директории.
      import os
      
      new_directory_path = "/путь/к/новой_директории"
      os.mkdir(new_directory_path)
      
  5. os.remove(path):
    • Удаление файла.
      import os
      
      file_to_delete = "/путь/к/удаляемому_файлу.txt"
      os.remove(file_to_delete)
      
  6. os.rmdir(path):
    • Удаление директории (должна быть пустой).
      import os
      
      directory_to_delete = "/путь/к/удаляемой_директории"
      os.rmdir(directory_to_delete)
      
  7. os.rename(src, dst):
    • Переименование файла или директории.
      import os
      
      old_name = "/путь/к/старому_файлу.txt"
      new_name = "/путь/к/новому_файлу.txt"
      os.rename(old_name, new_name)
      
  8. os.path.exists(path):
    • Проверка существования файла или директории.
      import os
      
      path_to_check = "/путь/к/файлу_или_директории"
      if os.path.exists(path_to_check):
          print("Файл или директория существует.")
      else:
          print("Файл или директория не существует.")
      
  9. os.path.isfile(path), os.path.isdir(path):
    • Проверка, является ли объект файлом или директорией.
      import os
      
      path_to_check = "/путь/к/файлу_или_директории"
      if os.path.isfile(path_to_check):
          print("Это файл.")
      elif os.path.isdir(path_to_check):
          print("Это директория.")
      else:
          print("Объект не является ни файлом, ни директорией.")
      
  10. os.path.join(path1, path2):
    • Объединение путей.
      import os
      
      path1 = "/путь/к/директории"
      path2 = "файл.txt"
      full_path = os.path.join(path1, path2)
      print(f"Полный путь: {full_path}")
      

Дополнительные возможности os для работы с операционной системой

  1. os.environ:
    • Содержит словарь переменных окружения текущего процесса.
      import os
      
      # Получение значения переменной окружения
      username = os.environ.get('USERNAME')
      print(f"Имя пользователя: {username}")
      
      # Установка новой переменной окружения
      os.environ['MY_VARIABLE'] = 'my_value'
      
  2. os.system(command):
    • Выполняет команду в командной строке.
      import os
      
      # Пример: выполнение команды 'dir' (Windows) или 'ls' (Linux)
      os.system('dir')
      
  3. os.name:
    • Строка, предоставляющая имя операционной системы.
      import os
      
      print(f"Имя операционной системы: {os.name}")
      
  4. os.getlogin():
    • Получение имени пользователя, под которым запущен процесс.
      import os
      
      print(f"Имя текущего пользователя: {os.getlogin()}")
      
  5. os.getpid(), os.getppid():
    • Получение идентификаторов текущего процесса и его родительского процесса.
      import os
      
      print(f"Идентификатор текущего процесса: {os.getpid()}")
      print(f"Идентификатор родительского процесса: {os.getppid()}")
      
  6. os.cpu_count():
    • Возвращает количество доступных процессорных ядер.
      import os
      
      print(f"Количество процессорных ядер: {os.cpu_count()}")
      
  7. os.get_terminal_size():
    • Возвращает размер терминала в виде кортежа (ширина, высота).
      import os
      
      terminal_size = os.get_terminal_size()
      print(f"Размер терминала: {terminal_size.columns}x{terminal_size.lines}")
      
  8. os.urandom(n):
    • Возвращает строку случайных байтов заданной длины.
      import os
      
      random_bytes = os.urandom(4)
      print(f"Случайные байты: {random_bytes}")
      

Задания на закрепление

Простые

Задание 1. Вывести текущую директорию.

Задание 2. Перейти в домашнюю директорию пользователя.

Задание 3. Вывести список файлов в текущей директории.

Задание 4. Создать новую директорию с именем «НоваяДиректория».

Задание 5. Проверить существование файла «example.txt» в текущей директории.

Решения 1-5
import os

# Задание 1: Вывести текущую директорию
current_directory = os.getcwd()
print(f"Текущая директория: {current_directory}")

# Задание 2: Перейти в домашнюю директорию пользователя
home_directory = os.path.expanduser("~")
print(f"Домашняя директория: {home_directory}")

# Задание 3: Вывести список файлов в текущей директории
files_in_current_directory = os.listdir(".")
print(f"Список файлов в текущей директории: {files_in_current_directory}")

# Задание 4: Создать новую директорию "НоваяДиректория"
new_directory_name = "НоваяДиректория"
os.mkdir(new_directory_name)
print(f"Создана новая директория: {new_directory_name}")

# Задание 5: Проверить существование файла "example.txt"
file_to_check = "example.txt"
if os.path.exists(file_to_check):
    print(f"Файл {file_to_check} существует.")
else:
    print(f"Файл {file_to_check} не существует.")

Задания средней сложности.

Задание 6. Переместите все файлы с расширением «.txt» из текущей директории в новую поддиректорию «Текстовые_файлы».

Задание 7. Напишите программу для подсчета общего размера всех файлов в указанной директории (включая файлы в поддиректориях).

Задание 8. Создайте резервную копию всех файлов с расширением «.py» в текущей директории, добавив к их именам суффикс «_backup».

Задание 9. Найдите и выведите на экран пять самых больших файлов в текущей директории.

Задание 10. Напишите скрипт, который переименует все файлы в текущей директории, добавив к их именам текущую дату.

Решения 6-10
import os
import shutil
import datetime

# Задание 6: Переместить все файлы с расширением ".txt" в новую директорию
txt_files = [file for file in os.listdir(".") if file.endswith(".txt")]
new_directory = "Текстовые_файлы"
os.mkdir(new_directory)
for txt_file in txt_files:
    shutil.move(txt_file, os.path.join(new_directory, txt_file))

# Задание 7: Подсчитать общий размер всех файлов в указанной директории
directory_path = "/путь/к/директории"
total_size = 0
for dirpath, dirnames, filenames in os.walk(directory_path):
    for filename in filenames:
        file_path = os.path.join(dirpath, filename)
        total_size += os.path.getsize(file_path)
print(f"Общий размер файлов: {total_size} байт")

# Задание 8: Создать резервную копию всех файлов с расширением ".py"
py_files = [file for file in os.listdir(".") if file.endswith(".py")]
for py_file in py_files:
    shutil.copy2(py_file, f"{py_file}_backup")

# Задание 9: Найти и вывести на экран пять самых больших файлов
all_files = [(file, os.path.getsize(file)) for file in os.listdir(".") if os.path.isfile(file)]
largest_files = sorted(all_files, key=lambda x: x[1], reverse=True)[:5]
print(f"Пять самых больших файлов: {largest_files}")

# Задание 10: Переименовать все файлы, добавив к их именам текущую дату
current_date = datetime.datetime.now().strftime("%Y-%m-%d")
for file_to_rename in os.listdir("."):
    new_name = f"{current_date}_{file_to_rename}"
    os.rename(file_to_rename, new_name)

Модуль pathlib

pathlib — это модуль в стандартной библиотеке Python, предназначенный для более удобной и интуитивно понятной работы с путями к файлам и директориям в сравнении с более старыми методами, предоставляемыми модулем os.

Основные классы в модуле pathlib:

  1. Path:
    • Основной класс, представляющий путь к файлу или директории.
  2. Основные методы класса Path:
    • Path.cwd(): Возвращает текущую рабочую директорию в виде объекта Path.
    • Path.home(): Возвращает домашнюю директорию пользователя в виде объекта Path.
    • Path.exists(): Проверяет, существует ли файл или директория по указанному пути.
    • Path.is_file(), Path.is_dir(): Проверяют, является ли объект файлом или директорией соответственно.
    • Path.mkdir(): Создает новую директорию.
    • Path.rmdir(): Удаляет пустую директорию.
    • Path.rename(): Переименовывает файл или директорию.
    • Path.glob(pattern): Возвращает генератор объектов Path для всех файлов, соответствующих заданному шаблону.
    • Path.iterdir(): Возвращает генератор объектов Path для всех файлов и поддиректорий в текущей директории.
    • Path.resolve(): Преобразует путь в абсолютный.
    • Path.unlink(): Удаляет файл.
    • Path.with_suffix(new_suffix): Возвращает новый объект Path с измененным расширением файла.
    • Path.joinpath(other_path): Объединяет текущий путь с другим путем и возвращает новый объект Path.
  3. Атрибуты класса Path:
    • Path.parts: Возвращает кортеж с компонентами пути.
    • Path.parent: Возвращает родительскую директорию.
    • Path.name: Возвращает последний компонент пути (имя файла или директории).
    • Path.stem: Возвращает имя файла без расширения.
    • Path.suffix: Возвращает расширение файла (пустая строка, если расширение отсутствует).

Пример использования модуля pathlib:

from pathlib import Path

# Создание объекта Path
file_path = Path("/путь/к/файлу.txt")

# Проверка существования файла
if file_path.exists():
    print(f"{file_path} существует.")

# Вывод родительской директории
print(f"Родительская директория: {file_path.parent}")

# Создание нового пути с измененным расширением
new_path = file_path.with_suffix(".html")
print(f"Новый путь: {new_path}")
  1. Создание нового файла:
    from pathlib import Path
    
    # Создание объекта Path для нового файла
    new_file_path = Path("новый_файл.txt")
    
    # Запись в файл
    with new_file_path.open(mode="w") as file:
        file.write("Привет, мир!")
    
  2. Перебор файлов в директории:
    from pathlib import Path
    
    # Создание объекта Path для текущей директории
    current_directory = Path.cwd()
    
    # Перебор файлов в текущей директории
    for file_path in current_directory.iterdir():
        print(file_path)
    
  3. Поиск файлов с определенным расширением:
    from pathlib import Path
    
    # Создание объекта Path для текущей директории
    current_directory = Path.cwd()
    
    # Поиск файлов с расширением ".txt"
    txt_files = list(current_directory.glob("*.txt"))
    print("Текстовые файлы:", txt_files)
    
  4. Создание резервной копии всех файлов в директории:
    from pathlib import Path
    import shutil
    
    # Создание объекта Path для текущей директории
    current_directory = Path.cwd()
    
    # Создание поддиректории для резервных копий
    backup_directory = current_directory / "backup"
    backup_directory.mkdir(exist_ok=True)
    
    # Копирование файлов в резервную директорию
    for file_path in current_directory.iterdir():
        if file_path.is_file():
            shutil.copy2(file_path, backup_directory / file_path.name)
    
  5. Рекурсивное удаление директории:
    from pathlib import Path
    import shutil
    
    # Создание объекта Path для директории, которую нужно удалить
    directory_to_delete = Path("удаляемая_директория")
    
    # Рекурсивное удаление директории
    shutil.rmtree(directory_to_delete)
    

Задания на использование pathlib

Задание 11. Создайте объект Path для текущей рабочей директории и выведите его на экран.

Задание 12. Проверьте существование файла «example.txt» в текущей директории.

Задание 13. Создайте новый файл «новый_файл.txt» и напишите в него любой текст.

Задание 14. Переместите файл «новый_файл.txt» в поддиректорию «Документы».

Задание 15. Найдите все файлы с расширением «.py» в текущей и поддиректориях и выведите их на экран.

Решения 11-15
from pathlib import Path

# Задание 11: Создать объект Path для текущей рабочей директории
current_directory_path = Path.cwd()
print(f"Текущая директория: {current_directory_path}")

# Задание 12: Проверить существование файла "example.txt"
example_file_path = Path("example.txt")
if example_file_path.exists():
    print(f"Файл {example_file_path} существует.")
else:
    print(f"Файл {example_file_path} не существует.")

# Задание 13: Создать новый файл "новый_файл.txt" и записать в него текст
new_file_path = Path("новый_файл.txt")
with new_file_path.open(mode="w") as file:
    file.write("Привет, мир!")

# Задание 14: Переместить файл "новый_файл.txt" в поддиректорию "Документы"
documents_directory = current_directory_path / "Документы"
new_file_path.rename(documents_directory / new_file_path.name)

# Задание 15: Найти все файлы с расширением ".py" и вывести их на экран
py_files = list(current_directory_path.rglob("*.py"))
print("Python-файлы:")
for py_file in py_files:
    print(py_file)

Библиотека shutil

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

Методы:

  1. shutil.copy(src, dst, *, follow_symlinks=True):
    • Копирует файл из src в dst.
  2. shutil.copy2(src, dst, *, follow_symlinks=True):
    • Копирует файл из src в dst и сохраняет метаданные (время создания, последнего доступа).
  3. shutil.copyfile(src, dst, *, follow_symlinks=True):
    • Копирует содержимое файла из src в dst.
  4. shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False):
    • Рекурсивно копирует директорию из src в dst.
  5. shutil.rmtree(path, ignore_errors=False, onerror=None):
    • Рекурсивно удаляет директорию.
  6. shutil.move(src, dst, copy_function=copy2):
    • Перемещает файл или директорию из src в dst.
  7. shutil.rmtree(path, ignore_errors=False, onerror=None):
    • Рекурсивно удаляет директорию.
  8. shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, dry_run=0, owner=None, group=None, logger=None):
    • Создает архив и возвращает полный путь к созданному архиву.

Исключения:

  1. shutil.Error:
    • Исключение, которое возникает при ошибках в операциях shutil.

Примеры использования shutil

import shutil

# Пример 1: Копирование файла
shutil.copy("source.txt", "destination.txt")

# Пример 2: Копирование директории
shutil.copytree("source_directory", "destination_directory")

# Пример 3: Перемещение файла
shutil.move("old_location/file.txt", "new_location/file.txt")

# Пример 4: Удаление директории
shutil.rmtree("directory_to_delete")

# Пример 5: Создание архива
shutil.make_archive("archive", "zip", root_dir="source_directory")

Объяснения:

  1. shutil.copy(): Копирует файл из «source.txt» в «destination.txt».
  2. shutil.copytree(): Рекурсивно копирует директорию «source_directory» в «destination_directory».
  3. shutil.move(): Перемещает файл «old_location/file.txt» в «new_location/file.txt».
  4. shutil.rmtree(): Рекурсивно удаляет директорию «directory_to_delete».
  5. shutil.make_archive(): Создает архив «archive.zip» из директории «source_directory».

Модуль glob

Модуль glob предоставляет функции для поиска файлов, соответствующих заданному шаблону, используя синтаксис, похожий на регулярные выражения.

Методы:

  1. glob.glob(pathname, *, recursive=False):
    • Возвращает список путей, соответствующих шаблону pathname.
  2. glob.iglob(pathname, *, recursive=False):
    • Возвращает генератор, который возвращает пути, соответствующие шаблону pathname.

Атрибуты:

  1. glob.escape(pathname):
    • Экранирует все специальные символы в шаблоне pathname.

Пример использования методов и атрибута модуля glob:

import glob

# Пример 1: Поиск всех файлов с расширением .txt в текущей директории
txt_files = glob.glob("*.txt")
print("Текстовые файлы:", txt_files)

# Пример 2: Поиск всех файлов с расширением .py в текущей и поддиректориях
py_files_recursive = glob.glob("*.py", recursive=True)
print("Python-файлы (рекурсивно):", py_files_recursive)

# Пример 3: Использование генератора iglob для поиска файлов
for file_path in glob.iglob("*.txt"):
    print(f"Найден файл: {file_path}")

# Пример 4: Экранирование специальных символов в шаблоне
escaped_pattern = glob.escape("?.txt")
print("Экранированный шаблон:", escaped_pattern)

Модуль subprocess

Модуль subprocess в Python предоставляет удобные средства для запуска и взаимодействия с дочерними процессами.

Классы:

  1. subprocess.CompletedProcess:
    • Класс, представляющий результат выполнения процесса.

Методы:

  1. subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, text=None, encoding=None, errors=None, env=None, universal_newlines=None, pass_fds=(), *, start_new_session=False, **other_popen_kwargs):
    • Запускает команду в новом процессе и возвращает объект CompletedProcess.
  2. subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None):
    • Запускает новый процесс и возвращает объект Popen, представляющий дочерний процесс.

Атрибуты:

  1. subprocess.PIPE:
    • Константа, используемая для указания, что нужно создать канал для ввода/вывода.
  2. subprocess.STDOUT:
    • Константа, используемая для указания, что нужно объединить стандартный вывод и стандартный поток ошибок.

Пример использования методов и атрибутов модуля subprocess:

import subprocess

# Пример 1: Запуск команды и получение результата
result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
print("Вывод команды 'ls -l':", result.stdout)

# Пример 2: Запуск процесса и передача данных через стандартный ввод
input_data = "Hello, subprocess!"
result = subprocess.run(["cat"], input=input_data, capture_output=True, text=True)
print("Вывод команды 'cat' с передачей данных:", result.stdout)

# Пример 3: Запуск процесса с использованием Popen
process = subprocess.Popen(["echo", "Hello, Popen!"], stdout=subprocess.PIPE, text=True)
output, _ = process.communicate()
print("Вывод команды 'echo' через Popen:", output)

Объяснения:

  1. subprocess.run(["ls", "-l"], capture_output=True, text=True): Запускает команду «ls -l» и возвращает объект CompletedProcess, содержащий результат выполнения команды.
  2. subprocess.run(["cat"], input=input_data, capture_output=True, text=True): Запускает команду «cat» и передает данные через стандартный ввод, затем возвращает объект CompletedProcess с результатом.
  3. subprocess.Popen(["echo", "Hello, Popen!"], stdout=subprocess.PIPE, text=True): Запускает процесс с использованием Popen, организует взаимодействие с процессом и получает результат через communicate().

Модуль fileinput

Модуль fileinput в Python предоставляет удобные средства для итерации по строкам текстовых файлов.

Классы:

  1. fileinput.FileInput:
    • Класс, предоставляющий удобный интерфейс для обработки файлов.

Методы:

  1. fileinput.input(files=None, inplace=False, backup='', mode='r', openhook=None):
    • Возвращает объект FileInput, предназначенный для итерации по строкам текстовых файлов.

Атрибуты:

  1. fileinput.filename():
    • Возвращает имя текущего обрабатываемого файла.
  2. fileinput.lineno():
    • Возвращает номер текущей строки в текущем файле.
  3. fileinput.filelineno():
    • Возвращает номер текущей строки в текущем файле, начиная с 1 для каждого файла.
  4. fileinput.isfirstline():
    • Возвращает True, если текущая строка является первой в файле.
  5. fileinput.isstdin():
    • Возвращает True, если текущая строка считана из стандартного ввода.
  6. fileinput.nextfile():
    • Закрывает текущий файл и переходит к следующему.

Пример использования методов и атрибутов модуля fileinput:

import fileinput

# Пример: Замена всех вхождений слова "old" на "new" в файлах "example.txt" и "example2.txt"
with fileinput.input(files=["example.txt", "example2.txt"], inplace=True, backup=".bak") as f_input:
    for line in f_input:
        if "old" in line:
            line = line.replace("old", "new")
        print(line, end="")

# Пример использования атрибутов
with fileinput.input(files=["example.txt"]) as f_input:
    for line in f_input:
        if f_input.isfirstline():
            print(f"Processing file: {f_input.filename()}")
        print(f"Line {f_input.lineno()}: {line.strip()}")

Объяснения:

  1. fileinput.input(files=["example.txt", "example2.txt"], inplace=True, backup=".bak"): Возвращает объект FileInput для итерации по строкам из указанных файлов с заменой содержимого в тех файлах, где обнаружены изменения, и созданием резервных копий файлов с расширением «.bak».
  2. f_input.filename(): Возвращает имя текущего обрабатываемого файла.
  3. f_input.lineno(): Возвращает номер текущей строки в текущем файле.
  4. f_input.isfirstline(): Возвращает True, если текущая строка является первой в файле.
  5. f_input.nextfile(): Закрывает текущий файл и переходит к следующему файлу в списке.

Работа с архивами в Python. Модули zipfile и gzip

Модуль gzip

Классы:

  1. gzip.GzipFile(fileobj=None, mode=None, compresslevel=9, *, filename=None, mtime=None):
    • Класс для работы с gzip-файлами.

Методы:

  1. gzip.open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None):
    • Открывает gzip-файл в указанном режиме.

Атрибуты:

  1. gzip.READABLE и gzip.WRITABLE (константы):
    • Используются для определения режима открытия gzip-файла на чтение или запись.

Модуль zipfile

Классы:

  1. zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, strict_timestamps=True):
    • Класс для работы с ZIP-архивами.

Методы:

  1. zipfile.ZipFile.extractall(path=None, members=None, pwd=None):
    • Извлекает все файлы из архива в указанную директорию.
  2. zipfile.ZipFile.extract(member, path=None, pwd=None):
    • Извлекает указанный файл из архива в указанную директорию.
  3. zipfile.ZipFile.read(name, pwd=None):
    • Считывает содержимое файла из архива в бинарном режиме.
  4. zipfile.ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False):
    • Открывает файл из архива в текстовом или бинарном режиме.

Атрибуты:

  1. zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED, zipfile.ZIP_BZIP2, zipfile.ZIP_LZMA (константы):
    • Типы компрессии для ZIP-архивов.

Пример использования модулей gzip и zipfile:

import gzip
import zipfile
import os

# Пример с gzip
with open("example.txt", "w") as file:
    file.write("Hello, Gzip!")

with gzip.open("example.txt.gz", "wb") as gz_file:
    with open("example.txt", "rb") as file:
        gz_file.write(file.read())

# Пример с zipfile
with zipfile.ZipFile("example.zip", "w") as zip_file:
    zip_file.write("example.txt")

# Извлекаем содержимое из архива
with zipfile.ZipFile("example.zip", "r") as zip_file:
    zip_file.extractall("extracted_content")

# Чтение содержимого из gzip-файла
with gzip.open("example.txt.gz", "rt") as gz_file:
    content = gz_file.read()
    print(content)

# Удаление временных файлов
os.remove("example.txt")
os.remove("example.txt.gz")
os.remove("example.zip")
os.rmdir("extracted_content")

Модуль hashlib

Модуль hashlib в Python предоставляет функции хеширования для создания криптографически безопасных хеш-функций.

Классы:

  1. hashlib.algorithms_guaranteed:
    • Список алгоритмов хеширования, доступных в модуле на всех платформах.
  2. hashlib.algorithms_available:
    • Список алгоритмов хеширования, доступных в модуле на текущей платформе.
  3. hashlib.Hash(algorithm, *, data=b''):
    • Класс для создания объекта хеша для конкретного алгоритма.

Методы:

  1. hash.update(data):
    • Обновляет хеш-объект данными.
  2. hash.digest():
    • Возвращает байтовую строку, представляющую хеш-значение.
  3. hash.hexdigest():
    • Возвращает строку, представляющую хеш-значение в виде шестнадцатеричной строки.

Атрибуты:

  1. hash.block_size:
    • Размер блока хеширования.
  2. hash.digest_size:
    • Размер хеш-значения в байтах.

Пример использования методов и атрибутов модуля hashlib:

import hashlib

# Пример: Хеширование строки с использованием различных алгоритмов
message = "Hello, hashlib!"

# Доступные алгоритмы хеширования
available_algorithms = hashlib.algorithms_available
print("Доступные алгоритмы:", available_algorithms)

# Хеширование с использованием различных алгоритмов
for algorithm in available_algorithms:
    # Создание объекта хеша для конкретного алгоритма
    hash_object = hashlib.new(algorithm)

    # Обновление хеша данными
    hash_object.update(message.encode("utf-8"))

    # Получение и вывод хеш-значения в виде шестнадцатеричной строки
    hash_value_hex = hash_object.hexdigest()
    print(f"{algorithm}: {hash_value_hex}")

Объяснения:

  1. hashlib.algorithms_available: Возвращает список алгоритмов хеширования, доступных в модуле на текущей платформе.
  2. hashlib.new(algorithm): Создает новый объект хеша для указанного алгоритма.
  3. hash.update(data): Обновляет хеш-объект данными.
  4. hash.hexdigest(): Возвращает строку, представляющую хеш-значение в виде шестнадцатеричной строки.
  5. В приведенном примере строки «Hello, hashlib!» хешируются с использованием всех доступных алгоритмов, и для каждого алгоритма выводится его хеш-значение.

Использование hashlib при работе с файлами и операционной системой

Библиотека hashlib в первую очередь используется для создания хеш-значений данных, таких как строки или байтов. Однако, в контексте работы с файловой системой или операционной системой, она может быть применена для следующих задач:

  1. Проверка целостности файлов:
    • При скачивании файлов из сети или получении данных от других источников, можно создать хеш-сумму файла с помощью hashlib и затем сравнить ее с известным хешем-значением. Если хеш-суммы совпадают, это может служить индикатором целостности файла.
      import hashlib
      
      def calculate_file_hash(file_path, algorithm="sha256", buffer_size=8192):
          hash_object = hashlib.new(algorithm)
          with open(file_path, "rb") as file:
              while chunk := file.read(buffer_size):
                  hash_object.update(chunk)
          return hash_object.hexdigest()
      
      # Пример: Проверка целостности файла
      expected_hash = "..."  # известное хеш-значение
      file_path = "example_file.txt"
      calculated_hash = calculate_file_hash(file_path)
      
      if calculated_hash == expected_hash:
          print("Файл целостен.")
      else:
          print("Файл поврежден или изменен.")
      
  2. Сравнение содержимого файлов:
    • При необходимости сравнения содержимого двух файлов, можно создать хеш-суммы для обоих файлов и сравнить их. Если хеш-суммы совпадают, содержимое файлов идентично.
      import hashlib
      
      def compare_files(file1_path, file2_path, algorithm="sha256", buffer_size=8192):
          hash1 = calculate_file_hash(file1_path, algorithm, buffer_size)
          hash2 = calculate_file_hash(file2_path, algorithm, buffer_size)
          return hash1 == hash2
      
      # Пример: Сравнение содержимого двух файлов
      file1_path = "file1.txt"
      file2_path = "file2.txt"
      
      if compare_files(file1_path, file2_path):
          print("Содержимое файлов идентично.")
      else:
          print("Содержимое файлов различно.")
      
  3. Генерация уникальных идентификаторов для файлов:
    • Можно использовать хеш-значение файла в качестве уникального идентификатора, который может быть использован, например, для идентификации файлов в системе управления версиями или для создания уникальных имен файлов.
      import hashlib
      import os
      
      def generate_unique_filename(file_path, algorithm="sha256"):
          hash_value = calculate_file_hash(file_path, algorithm)
          file_name, file_extension = os.path.splitext(os.path.basename(file_path))
          unique_filename = f"{hash_value}{file_extension}"
          return unique_filename
      
      # Пример: Генерация уникального имени файла на основе хеша
      original_file_path = "document.pdf"
      unique_filename = generate_unique_filename(original_file_path)
      
      print(f"Оригинальное имя файла: {os.path.basename(original_file_path)}")
      print(f"Уникальное имя файла: {unique_filename}")
      

Модуль pathvalidate

Классы:

  1. Platform(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
    • Атрибуты:
      • LINUX = 'Linux'
      • MACOS = 'macOS'
      • POSIX = 'POSIX'
      • UNIVERSAL = 'universal'
      • WINDOWS = 'Windows'

Методы:

  1. validate_filename(filename: PathType, platform: PlatformType | None = None, min_len: int = 1, max_len: int = 255, fs_encoding: str | None = None, check_reserved: bool = True, additional_reserved_names: Sequence[str] | None = None) -> None
    • Проверяет, является ли заданное имя файла допустимым.
    • Параметры:
      • filename: Имя файла для проверки.
      • platform: Целевая платформа имени файла.
      • min_len: Минимальная длина имени файла в байтах.
      • max_len: Максимальная длина имени файла в байтах.
      • fs_encoding: Кодировка файловой системы.
      • check_reserved: Проверять ли зарезервированные имена.
      • additional_reserved_names: Дополнительные зарезервированные имена.
  2. is_valid_filename(filename: PathType, platform: PlatformType | None = None, min_len: int = 1, max_len: int | None = None, fs_encoding: str | None = None, check_reserved: bool = True, additional_reserved_names: Sequence[str] | None = None) -> bool
    • Проверяет, является ли заданное имя файла допустимым, возвращая булево значение.
  3. validate_filepath(file_path: PathType, platform: PlatformType | None = None, min_len: int = 1, max_len: int | None = None, fs_encoding: str | None = None, check_reserved: bool = True, additional_reserved_names: Sequence[str] | None = None) -> None
    • Проверяет, является ли заданный путь к файлу допустимым.
  4. is_valid_filepath(file_path: PathType, platform: PlatformType | None = None, min_len: int = 1, max_len: int | None = None, fs_encoding: str | None = None, check_reserved: bool = True, additional_reserved_names: Sequence[str] | None = None) -> bool
    • Проверяет, является ли заданный путь к файлу допустимым, возвращая булево значение.
  5. validate_symbol(text: str) -> None
    • Проверяет, содержит ли текст символы.
  6. replace_symbol(text: str, replacement_text: str = '', exclude_symbols: Sequence[str] = [], is_replace_consecutive_chars: bool = False, is_strip: bool = False) -> str
    • Заменяет символы в тексте.

Пример использования:

from pathvalidate import (
    validate_filename, is_valid_filename,
    validate_filepath, is_valid_filepath,
    validate_symbol, replace_symbol
)

# Пример использования validate_filename
try:
    validate_filename("file:name.txt", platform='Windows', check_reserved=False)
except ValidationError as e:
    print(f"ValidationError: {e}")

# Пример использования is_valid_filename
filename_validity = is_valid_filename("file_name.txt", platform='universal')
print(f"Is Valid Filename? {filename_validity}")

# Пример использования validate_filepath
try:
    validate_filepath("/path/to/file:name.txt", platform='Linux')
except ValidationError as e:
    print(f"ValidationError: {e}")

# Пример использования is_valid_filepath
filepath_validity = is_valid_filepath("/path/to/file_name.txt", platform='Linux')
print(f"Is Valid Filepath? {filepath_validity}")

# Пример использования validate_symbol
try:
    validate_symbol("text_with_@_symbol")
except ValidationError as e:
    print(f"ValidationError: {e}")

# Пример использования replace_symbol
modified_text = replace_symbol("text@with@symbols", replacement_text='_', exclude_symbols=['@'])
print(f"Modified Text: {modified_text}")

Задания на тренировку работы с библиотеками

Задание 16. Создайте пустой текстовый файл «example.txt» в текущей директории с использованием модуля pathlib.

Задание 17. Скопируйте файл «example.txt» в новый файл «example_copy.txt» в текущей директории с использованием модуля shutil.

Задание 18. Используя модуль subprocess, выполните команду «echo Hello, World!» в командной оболочке и получите вывод.

Задание 19. С помощью модуля glob найдите все файлы с расширением «.txt» в текущей директории и выведите их список.

Задание 20. Создайте архив «example.zip» и добавьте в него файлы «example.txt» и «example_copy.txt» с использованием модуля zipfile.

Задание 21. Используя модуль fileinput, замените все вхождения слова «Hello» на «Hi» в файле «example.txt».

Задание 22. Вычислите MD5 хэш файла «example.txt» с использованием модуля hashlib и выведите его.

Задание 23. Архивируйте файл «example.txt» с использованием модуля gzip и сохраните его как «example.txt.gz».

Задание 24. Проверьте, существует ли файл «example.txt.gz» и распакуйте его с использованием модуля gzip.

Задание 25. Используя модуль pathvalidate, создайте функцию, которая проверяет, содержится ли введенная строка валидное имя файла и возвращает True или False.

Решения
# Решения заданий с объяснениями в комментариях
from pathlib import Path
import shutil
import subprocess
import glob
import zipfile
import fileinput
import hashlib
import gzip
from pathvalidate import is_valid_filename

# Задание 16
Path("example.txt").write_text("")

# Задание 17
shutil.copy("example.txt", "example_copy.txt")

# Задание 18
result = subprocess.run(["echo", "Hello, World!"], capture_output=True, text=True)
print(result.stdout)

# Задание 19
txt_files = glob.glob("*.txt")
print(txt_files)

# Задание 20
with zipfile.ZipFile("example.zip", "w") as zip_file:
    zip_file.write("example.txt")
    zip_file.write("example_copy.txt")

# Задание 21
with fileinput.FileInput("example.txt", inplace=True, backup=".bak") as file:
    for line in file:
        print(line.replace("Hello", "Hi"), end="")

# Задание 22
md5_hash = hashlib.md5(Path("example.txt").read_bytes()).hexdigest()
print(md5_hash)

# Задание 23
with open("example.txt", "rb") as f_in, gzip.open("example.txt.gz", "wb") as f_out:
    shutil.copyfileobj(f_in, f_out)

# Задание 24
if Path("example.txt.gz").exists():
    with gzip.open("example.txt.gz", "rb") as f_in, open("unzipped_example.txt", "wb") as f_out:
        shutil.copyfileobj(f_in, f_out)

# Задание 25
def is_valid_filename_check(input_str):
    return is_valid_filename(input_str)

# Пример использования:
input_string = "example.txt"
print(is_valid_filename_check(input_string))

Задания повышенной сложности.

Задание 26. Создайте функцию, которая принимает путь к директории и сжимает все текстовые файлы в этой директории в архив «archive.zip» с использованием модуля shutil и zipfile.

Задание 27. Используя модуль subprocess, выполните команду «dir» (или «ls» на Linux/Mac) в командной оболочке и выведите результат выполнения.

Задание 28. С использованием модуля glob найдите все файлы с расширением «.log» в текущей директории и объедините их в один текстовый файл «merged_logs.txt».

Задание 29. Создайте архив «backup.zip», включающий в себя все файлы (включая поддиректории) из директории «backup_source», используя модуль shutil и zipfile.

Задание 30. Используя модуль fileinput, добавьте текущую дату и время в начало каждого файла с расширением «.txt» в текущей директории.

Решения
# Решения заданий с объяснениями в комментариях
import shutil
import subprocess
import glob
import zipfile
import fileinput
import gzip
from datetime import datetime
from pathlib import Path
from pathvalidate import sanitize_filename

# Задание 26
def compress_text_files(directory_path):
    with zipfile.ZipFile("archive.zip", "w") as zip_file:
        for txt_file in glob.glob(f"{directory_path}/*.txt"):
            zip_file.write(txt_file)

# Задание 27
result = subprocess.run(["dir"], capture_output=True, text=True)
print(result.stdout)

# Задание 28
log_files = glob.glob("*.log")
with open("merged_logs.txt", "w") as merged_file:
    for log_file in log_files:
        with open(log_file, "r") as current_file:
            merged_file.write(current_file.read())

# Задание 29
shutil.make_archive("backup", "zip", "backup_source")

# Задание 30
current_datetime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
for txt_file in glob.glob("*.txt"):
    with fileinput.FileInput(txt_file, inplace=True, backup=".bak") as file:
        for line in file:
            print(f"{current_datetime}: {line}", end="")

# Замечание: Для заданий 28 и 30 можно использовать библиотеку logging для более эффективной записи логов.

Решение потенциальных проблем с ОС и файлами. Обработка ошибок

Работа с операционной системой и файлами может столкнуться с различными потенциальными проблемами. Обработка ошибок позволяет эффективно управлять возможными ситуациями, таким образом, повышая надежность и безопасность программы. Рассмотрим некоторые типичные проблемы и способы их решения через обработку ошибок:

  1. Отсутствие файла или директории:
    • Проблема: Попытка доступа или выполнения операций над файлом или директорией, которых нет.
    • Обработка ошибок: Использование конструкции try-except для перехвата и обработки исключения FileNotFoundError или IsADirectoryError.
      try:
          with open("не_существующий_файл.txt", "r") as file:
              content = file.read()
      except FileNotFoundError:
          print("Файл не найден.")
      except IsADirectoryError:
          print("Это директория, а не файл.")
      
  2. Недостаточные права доступа:
    • Проблема: Попытка выполнения операций, для которых у пользователя нет достаточных прав доступа.
    • Обработка ошибок: Использование try-except для перехвата и обработки исключения PermissionError.
      try:
          with open("/etc/sudoers", "r") as file:
              content = file.read()
      except PermissionError:
          print("Недостаточно прав доступа для чтения файла.")
      
  3. Нехватка ресурсов:
    • Проблема: Исчерпание системных ресурсов при выполнении операций.
    • Обработка ошибок: Обработка исключения OSError или других связанных с ресурсами исключений.
      import os
      
      try:
          os.mkdir("/полный_путь/к/директории")
      except OSError as e:
          print(f"Не удалось создать директорию: {e}")
      
  4. Неправильный формат данных:
    • Проблема: Попытка выполнения операций над данными в неправильном формате.
    • Обработка ошибок: Проверка формата данных и использование конструкции try-except для обработки исключений, связанных с неправильным форматом данных.
      try:
          int_value = int("abc")
      except ValueError:
          print("Неправильный формат данных для преобразования в int.")
      
  5. Конфликт имен файлов:
    • Проблема: Попытка создания файла или директории с именем, которое уже существует.
    • Обработка ошибок: Использование try-except для обработки исключения FileExistsError или других связанных с конфликтом имен исключений.
      try:
          with open("существующий_файл.txt", "x"):
              pass
      except FileExistsError:
          print("Файл уже существует.")
      
  6. Проблемы с кодировкой:
    • Проблема: Ошибки при чтении или записи файлов из-за несоответствия кодировок.
    • Обработка ошибок: Указание явно кодировки при открытии файла и обработка UnicodeError.
      try:
          with open("файл.txt", "r", encoding="utf-8") as file:
              content = file.read()
      except UnicodeError as e:
          print(f"Ошибка кодировки: {e}")
      

Задания для тренировки обработки ошибок

Задание 31: Обработка ошибки открытия файла.

Откройте файл «несуществующий_файл.txt» для чтения. Обработайте исключение FileNotFoundError и выведите сообщение «Файл не найден».

Задание32: Обработка ошибки записи в существующий файл.

Попробуйте открыть файл «существующий_файл.txt» для записи с использованием режима «x». Обработайте исключение FileExistsError и выведите сообщение «Файл уже существует».

Задание33: Обработка ошибки чтения файла с неправильной кодировкой.

Откройте файл «некорректная_кодировка.txt» для чтения с указанием неверной кодировки (например, «utf-16»). Обработайте исключение UnicodeError и выведите сообщение «Ошибка при чтении файла из-за неправильной кодировки».

Задание34: Обработка ошибки удаления файла.

Попробуйте удалить файл «защищенный_файл.txt», который имеет атрибут «защищенный» (например, через атрибут только для чтения). Обработайте исключение PermissionError и выведите сообщение «Недостаточно прав для удаления файла».

Задание35: Обработка ошибки создания директории.

Попробуйте создать директорию «существующая_директория» с использованием режима «x». Обработайте исключение FileExistsError и выведите сообщение «Директория уже существует».

Решение
# Решения с объяснениями в комментариях

# Задание 31
try:
    with open("несуществующий_файл.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("Файл не найден.")

# Задание 32
try:
    with open("существующий_файл.txt", "x") as file:
        file.write("Тестовое содержимое.")
except FileExistsError:
    print("Файл уже существует.")

# Задание 33
try:
    with open("некорректная_кодировка.txt", "r", encoding="utf-16") as file:
        content = file.read()
except UnicodeError:
    print("Ошибка при чтении файла из-за неправильной кодировки.")

# Задание 34
import os

try:
    os.remove("защищенный_файл.txt")
except PermissionError:
    print("Недостаточно прав для удаления файла.")

# Задание 35
try:
    os.mkdir("существующая_директория")
except FileExistsError:
    print("Директория уже существует.")

Примеры проектных работ на тему работа с файлами и операционной системой.

  1. Система управления файлами и директориями:
    • Разработайте консольное приложение для управления файлами и директориями. Пользователь должен иметь возможность просматривать содержимое текущей директории, создавать новые файлы, директории, копировать, перемещать и удалять файлы и директории.
  2. Резервное копирование:
    • Создайте программу для регулярного резервного копирования важных файлов пользователя. Реализуйте возможность выбора файлов или директорий для резервного копирования, выбора места назначения и частоты выполнения резервного копирования (ежедневно, еженедельно и т.д.).
  3. Архиватор файлов:
    • Реализуйте простой архиватор файлов. Пользователь должен иметь возможность создавать архивы из файлов и директорий, а также извлекать содержимое архивов. Добавьте опцию сжатия файлов для уменьшения размера архива.
  4. Хэширование файлов:
    • Создайте программу для генерации хэш-сумм файлов. Пользователь может выбрать файл или директорию, и программа должна рассчитать MD5 или SHA-256 хэш для каждого файла в выбранной директории. Результаты должны быть сохранены в текстовом файле.
  5. Поиск дубликатов файлов:
    • Напишите скрипт для поиска дубликатов файлов на компьютере. Программа должна сканировать все файлы в указанных директориях, вычислять хэш-суммы файлов и идентифицировать дубликаты. Пользователь должен иметь возможность выбрать, хочет ли он удалить дубликаты или просто получить отчет.
Понравилась статья? Поделиться с друзьями:
Школа Виктора Комлева
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.