Работа с операционной системой и файлами имеет широкий спектр практических применений. Например:
- Управление файлами и директориями:
- Создание, перемещение, переименование и удаление файлов и директорий.
- Навигация по файловой системе для поиска и обработки нужных данных.
- Обработка данных из файлов:
- Чтение и запись данных из/в текстовые файлы, CSV, JSON и другие форматы.
- Обработка больших объемов данных, например, в лог-файлах.
- Автоматизация задач:
- Автоматизация повседневных задач, таких как переименование множества файлов по определенному шаблону.
- Пакетная обработка файлов, например, изменение размера изображений.
- Системное администрирование:
- Изменение конфигурационных файлов и настройка системных параметров.
- Мониторинг состояния файловой системы и ресурсов компьютера.
- Взаимодействие с операционной системой:
- Запуск внешних программ и команд из скриптов.
- Работа с переменными окружения и другими системными ресурсами.
- Обеспечение безопасности данных:
- Шифрование и дешифрование файлов.
- Управление правами доступа к файлам и директориям.
- Работа с базами данных:
- Импорт и экспорт данных из и в базы данных.
- Архивация и резервное копирование данных.
- Разработка веб-приложений:
- Загрузка, сохранение и обработка файлов, отправленных пользователями.
- Чтение и запись данных в файловую систему, кэширование данных.
Библиотеки и модули Python, для работы с операционной системой и файлами.
- Модуль
os
иos.path
:os
: Предоставляет функции для взаимодействия с операционной системой.os.path
: Предоставляет функции для работы с путями к файлам и директориям.
- Модуль
pathlib
:- Предоставляет объектно-ориентированный интерфейс для работы с путями к файлам и директориям.
- Модуль
shutil
:- Позволяет выполнить различные операции с файлами, включая копирование, перемещение и удаление.
- Модуль
glob
:- Позволяет использовать шаблоны для поиска файлов в директориях.
- Модуль
subprocess
:- Предоставляет возможность запуска внешних процессов и выполнения команд в командной строке.
- Библиотека
os.environ
:- Позволяет взаимодействовать с переменными окружения операционной системы.
- Библиотека
fileinput
:- Упрощает обработку текстовых файлов в потоковом режиме.
- Библиотека
csv
:- Предоставляет функциональность для работы с файлами в формате CSV (Comma-Separated Values).
- Библиотека
json
:- Позволяет кодировать и декодировать данные в формате JSON.
- Библиотека
sqlite3
:- Интегрированная библиотека для работы с базой данных SQLite.
- Библиотека
gzip
иzipfile
:- Позволяют работать с сжатыми файлами в форматах Gzip и Zip соответственно.
- Библиотека
hashlib
:- Предоставляет интерфейс для работы с хеш-функциями, полезен для контроля целостности файлов.
- Библиотека
pathvalidate
:- Позволяет валидировать и нормализовать пути файлов и директорий.
- Библиотека
openpyxl
иpandas
:- Предоставляют возможности для работы с файлами Excel, как для чтения, так и для записи данных.
Модуль os
Основные функции для работы с файловой системой
os.getcwd()
:- Получение текущей рабочей директории.
import os current_directory = os.getcwd() print(f"Текущая директория: {current_directory}")
- Получение текущей рабочей директории.
os.chdir(path)
:- Изменение текущей директории.
import os new_directory = "/путь/к/новой/директории" os.chdir(new_directory)
- Изменение текущей директории.
os.listdir(path='.')
:- Получение списка файлов и директорий в указанной директории.
import os files_in_directory = os.listdir("/путь/к/директории") print(f"Список файлов и директорий: {files_in_directory}")
- Получение списка файлов и директорий в указанной директории.
os.mkdir(path)
:- Создание новой директории.
import os new_directory_path = "/путь/к/новой_директории" os.mkdir(new_directory_path)
- Создание новой директории.
os.remove(path)
:- Удаление файла.
import os file_to_delete = "/путь/к/удаляемому_файлу.txt" os.remove(file_to_delete)
- Удаление файла.
os.rmdir(path)
:- Удаление директории (должна быть пустой).
import os directory_to_delete = "/путь/к/удаляемой_директории" os.rmdir(directory_to_delete)
- Удаление директории (должна быть пустой).
os.rename(src, dst)
:- Переименование файла или директории.
import os old_name = "/путь/к/старому_файлу.txt" new_name = "/путь/к/новому_файлу.txt" os.rename(old_name, new_name)
- Переименование файла или директории.
os.path.exists(path)
:- Проверка существования файла или директории.
import os path_to_check = "/путь/к/файлу_или_директории" if os.path.exists(path_to_check): print("Файл или директория существует.") else: print("Файл или директория не существует.")
- Проверка существования файла или директории.
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("Объект не является ни файлом, ни директорией.")
- Проверка, является ли объект файлом или директорией.
os.path.join(path1, path2)
:- Объединение путей.
import os path1 = "/путь/к/директории" path2 = "файл.txt" full_path = os.path.join(path1, path2) print(f"Полный путь: {full_path}")
- Объединение путей.
Дополнительные возможности os
для работы с операционной системой
os.environ
:- Содержит словарь переменных окружения текущего процесса.
import os # Получение значения переменной окружения username = os.environ.get('USERNAME') print(f"Имя пользователя: {username}") # Установка новой переменной окружения os.environ['MY_VARIABLE'] = 'my_value'
- Содержит словарь переменных окружения текущего процесса.
os.system(command)
:- Выполняет команду в командной строке.
import os # Пример: выполнение команды 'dir' (Windows) или 'ls' (Linux) os.system('dir')
- Выполняет команду в командной строке.
os.name
:- Строка, предоставляющая имя операционной системы.
import os print(f"Имя операционной системы: {os.name}")
- Строка, предоставляющая имя операционной системы.
os.getlogin()
:- Получение имени пользователя, под которым запущен процесс.
import os print(f"Имя текущего пользователя: {os.getlogin()}")
- Получение имени пользователя, под которым запущен процесс.
os.getpid()
,os.getppid()
:- Получение идентификаторов текущего процесса и его родительского процесса.
import os print(f"Идентификатор текущего процесса: {os.getpid()}") print(f"Идентификатор родительского процесса: {os.getppid()}")
- Получение идентификаторов текущего процесса и его родительского процесса.
os.cpu_count()
:- Возвращает количество доступных процессорных ядер.
import os print(f"Количество процессорных ядер: {os.cpu_count()}")
- Возвращает количество доступных процессорных ядер.
os.get_terminal_size()
:- Возвращает размер терминала в виде кортежа (ширина, высота).
import os terminal_size = os.get_terminal_size() print(f"Размер терминала: {terminal_size.columns}x{terminal_size.lines}")
- Возвращает размер терминала в виде кортежа (ширина, высота).
os.urandom(n)
:- Возвращает строку случайных байтов заданной длины.
import os random_bytes = os.urandom(4) print(f"Случайные байты: {random_bytes}")
- Возвращает строку случайных байтов заданной длины.
Задания на закрепление
Простые
Задание 1. Вывести текущую директорию.
Задание 2. Перейти в домашнюю директорию пользователя.
Задание 3. Вывести список файлов в текущей директории.
Задание 4. Создать новую директорию с именем «НоваяДиректория».
Задание 5. Проверить существование файла «example.txt» в текущей директории.
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. Напишите скрипт, который переименует все файлы в текущей директории, добавив к их именам текущую дату.
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
:
Path
:- Основной класс, представляющий путь к файлу или директории.
- Основные методы класса
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
.
- Атрибуты класса
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}")
- Создание нового файла:
from pathlib import Path # Создание объекта Path для нового файла new_file_path = Path("новый_файл.txt") # Запись в файл with new_file_path.open(mode="w") as file: file.write("Привет, мир!")
- Перебор файлов в директории:
from pathlib import Path # Создание объекта Path для текущей директории current_directory = Path.cwd() # Перебор файлов в текущей директории for file_path in current_directory.iterdir(): print(file_path)
- Поиск файлов с определенным расширением:
from pathlib import Path # Создание объекта Path для текущей директории current_directory = Path.cwd() # Поиск файлов с расширением ".txt" txt_files = list(current_directory.glob("*.txt")) print("Текстовые файлы:", txt_files)
- Создание резервной копии всех файлов в директории:
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)
- Рекурсивное удаление директории:
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» в текущей и поддиректориях и выведите их на экран.
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
предоставляет удобные функции для выполнения различных операций с файлами и директориями в высокоуровневом стиле.
Методы:
shutil.copy(src, dst, *, follow_symlinks=True)
:- Копирует файл из
src
вdst
.
- Копирует файл из
shutil.copy2(src, dst, *, follow_symlinks=True)
:- Копирует файл из
src
вdst
и сохраняет метаданные (время создания, последнего доступа).
- Копирует файл из
shutil.copyfile(src, dst, *, follow_symlinks=True)
:- Копирует содержимое файла из
src
вdst
.
- Копирует содержимое файла из
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)
:- Рекурсивно копирует директорию из
src
вdst
.
- Рекурсивно копирует директорию из
shutil.rmtree(path, ignore_errors=False, onerror=None)
:- Рекурсивно удаляет директорию.
shutil.move(src, dst, copy_function=copy2)
:- Перемещает файл или директорию из
src
вdst
.
- Перемещает файл или директорию из
shutil.rmtree(path, ignore_errors=False, onerror=None)
:- Рекурсивно удаляет директорию.
shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, dry_run=0, owner=None, group=None, logger=None)
:- Создает архив и возвращает полный путь к созданному архиву.
Исключения:
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")
Объяснения:
shutil.copy()
: Копирует файл из «source.txt» в «destination.txt».shutil.copytree()
: Рекурсивно копирует директорию «source_directory» в «destination_directory».shutil.move()
: Перемещает файл «old_location/file.txt» в «new_location/file.txt».shutil.rmtree()
: Рекурсивно удаляет директорию «directory_to_delete».shutil.make_archive()
: Создает архив «archive.zip» из директории «source_directory».
Модуль glob
Модуль glob
предоставляет функции для поиска файлов, соответствующих заданному шаблону, используя синтаксис, похожий на регулярные выражения.
Методы:
glob.glob(pathname, *, recursive=False)
:- Возвращает список путей, соответствующих шаблону
pathname
.
- Возвращает список путей, соответствующих шаблону
glob.iglob(pathname, *, recursive=False)
:- Возвращает генератор, который возвращает пути, соответствующие шаблону
pathname
.
- Возвращает генератор, который возвращает пути, соответствующие шаблону
Атрибуты:
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 предоставляет удобные средства для запуска и взаимодействия с дочерними процессами.
Классы:
subprocess.CompletedProcess
:- Класс, представляющий результат выполнения процесса.
Методы:
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
.
- Запускает команду в новом процессе и возвращает объект
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
, представляющий дочерний процесс.
- Запускает новый процесс и возвращает объект
Атрибуты:
subprocess.PIPE
:- Константа, используемая для указания, что нужно создать канал для ввода/вывода.
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)
Объяснения:
subprocess.run(["ls", "-l"], capture_output=True, text=True)
: Запускает команду «ls -l» и возвращает объектCompletedProcess
, содержащий результат выполнения команды.subprocess.run(["cat"], input=input_data, capture_output=True, text=True)
: Запускает команду «cat» и передает данные через стандартный ввод, затем возвращает объектCompletedProcess
с результатом.subprocess.Popen(["echo", "Hello, Popen!"], stdout=subprocess.PIPE, text=True)
: Запускает процесс с использованиемPopen
, организует взаимодействие с процессом и получает результат черезcommunicate()
.
Модуль fileinput
Модуль fileinput
в Python предоставляет удобные средства для итерации по строкам текстовых файлов.
Классы:
fileinput.FileInput
:- Класс, предоставляющий удобный интерфейс для обработки файлов.
Методы:
fileinput.input(files=None, inplace=False, backup='', mode='r', openhook=None)
:- Возвращает объект
FileInput
, предназначенный для итерации по строкам текстовых файлов.
- Возвращает объект
Атрибуты:
fileinput.filename()
:- Возвращает имя текущего обрабатываемого файла.
fileinput.lineno()
:- Возвращает номер текущей строки в текущем файле.
fileinput.filelineno()
:- Возвращает номер текущей строки в текущем файле, начиная с 1 для каждого файла.
fileinput.isfirstline()
:- Возвращает
True
, если текущая строка является первой в файле.
- Возвращает
fileinput.isstdin()
:- Возвращает
True
, если текущая строка считана из стандартного ввода.
- Возвращает
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()}")
Объяснения:
fileinput.input(files=["example.txt", "example2.txt"], inplace=True, backup=".bak")
: Возвращает объектFileInput
для итерации по строкам из указанных файлов с заменой содержимого в тех файлах, где обнаружены изменения, и созданием резервных копий файлов с расширением «.bak».f_input.filename()
: Возвращает имя текущего обрабатываемого файла.f_input.lineno()
: Возвращает номер текущей строки в текущем файле.f_input.isfirstline()
: ВозвращаетTrue
, если текущая строка является первой в файле.f_input.nextfile()
: Закрывает текущий файл и переходит к следующему файлу в списке.
Работа с архивами в Python. Модули zipfile
и gzip
Модуль gzip
Классы:
gzip.GzipFile(fileobj=None, mode=None, compresslevel=9, *, filename=None, mtime=None)
:- Класс для работы с gzip-файлами.
Методы:
gzip.open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)
:- Открывает gzip-файл в указанном режиме.
Атрибуты:
gzip.READABLE
иgzip.WRITABLE
(константы):- Используются для определения режима открытия gzip-файла на чтение или запись.
Модуль zipfile
Классы:
zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, strict_timestamps=True)
:- Класс для работы с ZIP-архивами.
Методы:
zipfile.ZipFile.extractall(path=None, members=None, pwd=None)
:- Извлекает все файлы из архива в указанную директорию.
zipfile.ZipFile.extract(member, path=None, pwd=None)
:- Извлекает указанный файл из архива в указанную директорию.
zipfile.ZipFile.read(name, pwd=None)
:- Считывает содержимое файла из архива в бинарном режиме.
zipfile.ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)
:- Открывает файл из архива в текстовом или бинарном режиме.
Атрибуты:
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 предоставляет функции хеширования для создания криптографически безопасных хеш-функций.
Классы:
hashlib.algorithms_guaranteed
:- Список алгоритмов хеширования, доступных в модуле на всех платформах.
hashlib.algorithms_available
:- Список алгоритмов хеширования, доступных в модуле на текущей платформе.
hashlib.Hash(algorithm, *, data=b'')
:- Класс для создания объекта хеша для конкретного алгоритма.
Методы:
hash.update(data)
:- Обновляет хеш-объект данными.
hash.digest()
:- Возвращает байтовую строку, представляющую хеш-значение.
hash.hexdigest()
:- Возвращает строку, представляющую хеш-значение в виде шестнадцатеричной строки.
Атрибуты:
hash.block_size
:- Размер блока хеширования.
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}")
Объяснения:
hashlib.algorithms_available
: Возвращает список алгоритмов хеширования, доступных в модуле на текущей платформе.hashlib.new(algorithm)
: Создает новый объект хеша для указанного алгоритма.hash.update(data)
: Обновляет хеш-объект данными.hash.hexdigest()
: Возвращает строку, представляющую хеш-значение в виде шестнадцатеричной строки.- В приведенном примере строки «Hello, hashlib!» хешируются с использованием всех доступных алгоритмов, и для каждого алгоритма выводится его хеш-значение.
Использование hashlib
при работе с файлами и операционной системой
Библиотека hashlib
в первую очередь используется для создания хеш-значений данных, таких как строки или байтов. Однако, в контексте работы с файловой системой или операционной системой, она может быть применена для следующих задач:
- Проверка целостности файлов:
- При скачивании файлов из сети или получении данных от других источников, можно создать хеш-сумму файла с помощью
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("Файл поврежден или изменен.")
- При скачивании файлов из сети или получении данных от других источников, можно создать хеш-сумму файла с помощью
- Сравнение содержимого файлов:
- При необходимости сравнения содержимого двух файлов, можно создать хеш-суммы для обоих файлов и сравнить их. Если хеш-суммы совпадают, содержимое файлов идентично.
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("Содержимое файлов различно.")
- При необходимости сравнения содержимого двух файлов, можно создать хеш-суммы для обоих файлов и сравнить их. Если хеш-суммы совпадают, содержимое файлов идентично.
- Генерация уникальных идентификаторов для файлов:
- Можно использовать хеш-значение файла в качестве уникального идентификатора, который может быть использован, например, для идентификации файлов в системе управления версиями или для создания уникальных имен файлов.
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
Классы:
Platform(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
- Атрибуты:
LINUX = 'Linux'
MACOS = 'macOS'
POSIX = 'POSIX'
UNIVERSAL = 'universal'
WINDOWS = 'Windows'
- Атрибуты:
Методы:
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
: Дополнительные зарезервированные имена.
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
- Проверяет, является ли заданное имя файла допустимым, возвращая булево значение.
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
- Проверяет, является ли заданный путь к файлу допустимым.
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
- Проверяет, является ли заданный путь к файлу допустимым, возвращая булево значение.
validate_symbol(text: str) -> None
- Проверяет, содержит ли текст символы.
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 для более эффективной записи логов.
Решение потенциальных проблем с ОС и файлами. Обработка ошибок
Работа с операционной системой и файлами может столкнуться с различными потенциальными проблемами. Обработка ошибок позволяет эффективно управлять возможными ситуациями, таким образом, повышая надежность и безопасность программы. Рассмотрим некоторые типичные проблемы и способы их решения через обработку ошибок:
- Отсутствие файла или директории:
- Проблема: Попытка доступа или выполнения операций над файлом или директорией, которых нет.
- Обработка ошибок: Использование конструкции
try-except
для перехвата и обработки исключения FileNotFoundError или IsADirectoryError.try: with open("не_существующий_файл.txt", "r") as file: content = file.read() except FileNotFoundError: print("Файл не найден.") except IsADirectoryError: print("Это директория, а не файл.")
- Недостаточные права доступа:
- Проблема: Попытка выполнения операций, для которых у пользователя нет достаточных прав доступа.
- Обработка ошибок: Использование
try-except
для перехвата и обработки исключения PermissionError.try: with open("/etc/sudoers", "r") as file: content = file.read() except PermissionError: print("Недостаточно прав доступа для чтения файла.")
- Нехватка ресурсов:
- Проблема: Исчерпание системных ресурсов при выполнении операций.
- Обработка ошибок: Обработка исключения OSError или других связанных с ресурсами исключений.
import os try: os.mkdir("/полный_путь/к/директории") except OSError as e: print(f"Не удалось создать директорию: {e}")
- Неправильный формат данных:
- Проблема: Попытка выполнения операций над данными в неправильном формате.
- Обработка ошибок: Проверка формата данных и использование конструкции
try-except
для обработки исключений, связанных с неправильным форматом данных.try: int_value = int("abc") except ValueError: print("Неправильный формат данных для преобразования в int.")
- Конфликт имен файлов:
- Проблема: Попытка создания файла или директории с именем, которое уже существует.
- Обработка ошибок: Использование
try-except
для обработки исключения FileExistsError или других связанных с конфликтом имен исключений.try: with open("существующий_файл.txt", "x"): pass except FileExistsError: print("Файл уже существует.")
- Проблемы с кодировкой:
- Проблема: Ошибки при чтении или записи файлов из-за несоответствия кодировок.
- Обработка ошибок: Указание явно кодировки при открытии файла и обработка 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("Директория уже существует.")
Примеры проектных работ на тему работа с файлами и операционной системой.
- Система управления файлами и директориями:
- Разработайте консольное приложение для управления файлами и директориями. Пользователь должен иметь возможность просматривать содержимое текущей директории, создавать новые файлы, директории, копировать, перемещать и удалять файлы и директории.
- Резервное копирование:
- Создайте программу для регулярного резервного копирования важных файлов пользователя. Реализуйте возможность выбора файлов или директорий для резервного копирования, выбора места назначения и частоты выполнения резервного копирования (ежедневно, еженедельно и т.д.).
- Архиватор файлов:
- Реализуйте простой архиватор файлов. Пользователь должен иметь возможность создавать архивы из файлов и директорий, а также извлекать содержимое архивов. Добавьте опцию сжатия файлов для уменьшения размера архива.
- Хэширование файлов:
- Создайте программу для генерации хэш-сумм файлов. Пользователь может выбрать файл или директорию, и программа должна рассчитать MD5 или SHA-256 хэш для каждого файла в выбранной директории. Результаты должны быть сохранены в текстовом файле.
- Поиск дубликатов файлов:
- Напишите скрипт для поиска дубликатов файлов на компьютере. Программа должна сканировать все файлы в указанных директориях, вычислять хэш-суммы файлов и идентифицировать дубликаты. Пользователь должен иметь возможность выбрать, хочет ли он удалить дубликаты или просто получить отчет.
Индивидуальное и групповое обучение «Python Junior»
Если вы хотите научиться программировать на Python, могу помочь. Запишитесь на мой курс «Python Junior» и начните свой путь в мир ИТ уже сегодня!
Контакты
Для получения дополнительной информации и записи на курсы свяжитесь со мной:
Телеграм: https://t.me/Vvkomlev
Email: victor.komlev@mail.ru
Объясняю сложное простыми словами. Даже если вы никогда не работали с ИТ и далеки от программирования, теперь у вас точно все получится! Проверено десятками примеров моих учеников.
Гибкий график обучения. Я предлагаю занятия в мини-группах и индивидуально, что позволяет каждому заниматься в удобном темпе. Вы можете совмещать обучение с работой или учебой.
Практическая направленность. 80%: практики, 20% теории. У меня множество авторских заданий, которые фокусируются на практике. Вы не просто изучаете теорию, а сразу применяете знания в реальных проектах и задачах.
Разнообразие учебных материалов: Теория представлена в виде текстовых уроков с примерами и видео, что делает обучение максимально эффективным и удобным.
Понимаю, что обучение информационным технологиям может быть сложным, особенно для новичков. Моя цель – сделать этот процесс максимально простым и увлекательным. У меня персонализированный подход к каждому ученику. Максимальный фокус внимания на ваши потребности и уровень подготовки.