ТранскрибаторТранскрибатор
Практическая инструкция

Python zipfile: как упаковать тексты расшифровок и проверить состав архива

ZIP для папки TXT, CSV и SRT: сохранение относительных путей, создание без перезаписи и проверка списка файлов. Пример Python для передачи рабочей версии проекта.

Транскрибатор
ЗАПИСЬПЛАН РАБОТЫОтберите файлы проектаСоздайте ZIP с путямиПроверьте состав и чтениеПроверить результатОТ СЛОВ К РЕЗУЛЬТАТУ
Работа с реальной записьюНаглядный учебный примерШаблон для копирования
1Отберите файлы проекта2Создайте ZIP с путями3Проверьте состав ичтение
Список отбора определяет состав; повторное открытие подтверждает, что созданная копия читается.

Соберите отдельную папку для передачи

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

Создайте project-texts и положите туда только материалы нужной версии. Учебный скрипт выбирает TXT, CSV и SRT во вложенных папках. DOCX, PDF и аудиофайлы в этот набор не входят. Изменяйте список расширений только после определения фактического состава передачи.

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

Сохраняйте относительные имена внутри ZIP

Если два интервью содержат файлы с одинаковым именем transcript.txt, добавление только basename создаёт неоднозначный состав. В примере сохраняется путь относительно project-texts: например, interview-12/transcript.txt и interview-13/transcript.txt.

Не помещайте в имя члена архива полный путь Вашего компьютера. relative_to(root).as_posix() формирует понятную структуру внутри ZIP. Скрипт исключает файлы, являющиеся символическими ссылками; папку отбора готовьте как обычную папку с обычными подпапками.

На время упаковки закончите редактирование выбранных файлов. Если документ меняется между составлением списка и чтением, архив может содержать уже другую редакцию. Называйте результат по проекту и версии, а не просто archive.zip.

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

Сохраните код как pack_texts.py рядом с project-texts и запустите python pack_texts.py или python3 pack_texts.py. Используется стандартный zipfile. Метод ZIP_DEFLATED обычно требует доступного модуля zlib в Вашей установке Python.

Режим "x" создаёт новый архив и сообщает об ошибке, если такое имя уже существует. Для следующего выпуска выберите новое имя версии. Не заменяйте режим на "w" без понимания, что он перезаписывает существующий файл.

from pathlib import Path
from zipfile import ZipFile, ZIP_DEFLATED

root = Path("project-texts")
archive = Path("project-texts-v01.zip")
files = sorted(path for path in root.rglob("*")
               if path.is_file() and not path.is_symlink()
               and path.suffix.lower() in {".txt", ".csv", ".srt"})
if not files:
    raise ValueError("Подходящих файлов нет")
expected = [path.relative_to(root).as_posix() for path in files]
print("Будут включены:")
print("\n".join(expected))
with ZipFile(archive, "x", compression=ZIP_DEFLATED) as target:
    for path, name in zip(files, expected):
        target.write(path, arcname=name)
with ZipFile(archive) as saved:
    if saved.namelist() != expected:
        raise ValueError("Состав архива не совпал")
    bad = saved.testzip()
    if bad is not None:
        raise ValueError(f"Ошибка проверки: {bad}")
print("Проверено файлов:", len(expected))

После выхода из блока with архив закрыт. Повторное открытие сравнивает список имён с ожидаемым и проверяет чтение членов через testzip. При успешной проверке testzip возвращает None. Это проверка целостности архива, а не экспертная оценка содержимого.

Проверьте комплект как рабочий результат

Выберите по одному контрольному файлу каждого типа и откройте его из сохранённого комплекта обычным просмотрщиком. Проверьте русский текст, заголовки таблицы и последнюю реплику. При сомнениях CSV можно сначала проверить через DictReader, а TXT-метки — по формату и порядку времени.

Сравните список ZIP с согласованным комплектом, а не только с содержимым случайной папки. Если нужного интервью изначально не было в project-texts, технически успешная проверка его не обнаружит как пропуск.

Этот скрипт не шифрует ZIP и не создаёт пароль. Не называйте обычный архив защищённым. Он также не заменяет резервную копию исходной записи: текстовые экспорты и аудиофайл выполняют разные роли.

Учебный пример

Учебный пример: одинаковые имена в разных интервью

Вымышленный проект содержит два интервью и отдельную таблицу. Относительные пути позволяют различить тексты.

Входной файлИмя в ZIPПроверка
project-texts/I12/transcript.txtI12/transcript.txtОткрывается текст I12
project-texts/I13/transcript.txtI13/transcript.txtНе подменяет I12
project-texts/quotes.csvquotes.csvСохранились колонки
ОтборНужные версииСверить комплектСтруктураОтносительные путиСравнить namelistЦелостностьЧтение членовВыполнить testzip
Правильный список, читаемый ZIP и корректные реплики требуют отдельных проверок.

После успешной проверки сохраните имя архива, дату и список файлов. Тогда следующую версию можно сравнить с понятной точкой отсчёта.

Паспорт комплекта расшифровок

Рабочая заготовкаВыделите и скопируйте
Проект: [название]
Версия комплекта: [номер]
Папка отбора: [имя]
Архив: [имя ZIP]
Ожидаемые материалы: [список]
Фактические имена в ZIP: [список]
Проверка testzip: [результат]
Контрольные файлы открыты: [имена]
Ограничения: [нет аудио / другие]

Частые вопросы

Скрипт включает аудио и PDF?

Нет. В учебном списке только TXT, CSV и SRT. Другой состав нужно задать отдельно.

testzip подтверждает правильность расшифровки?

Нет. Он проверяет чтение и контрольные значения членов архива, а не смысл текста.

Что делать, если ZIP уже существует?

Выберите новое имя версии. Режим "x" специально не перезаписывает существующий архив.

Обычный ZIP защищён паролем?

Нет. В этом примере шифрование не создаётся.