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

Чтение CSV-расшифровки через Python: как проверить колонки и пустые реплики

Проверка CSV перед анализом: DictReader, кодировка UTF-8, разделитель, обязательные поля и лишние значения. Рабочий скрипт, который не меняет исходный файл.

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

Определите схему файла до запуска

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

Учебная схема использует имена timecode, speaker и text. Если Ваш экспорт имеет другие колонки, сначала посмотрите строку заголовков и измените required в коде. Название «Время» не совпадает с timecode; это не доказывает повреждение файла, а показывает несовпадение схемы.

Сохраните проверяемую копию отдельно. Если файл ещё создаётся, сначала разберите экспорт расшифровки в CSV. Проверка ниже читает готовую таблицу и ничего в ней не перезаписывает.

Читайте CSV библиотекой, а не split

В CSV запятая может быть частью фразы: «Да, это верно». Перенос строки внутри корректно заключённого в кавычки поля тоже не создаёт отдельную реплику. Поэтому split(",") и чтение «одна физическая строка — одна запись» здесь ненадёжны.

В примере используется стандартная библиотека Python и csv.DictReader. Файл открывается с newline="". Кодировка utf-8-sig подходит для UTF-8 с необязательной начальной меткой BOM; она не определяет автоматически любую кодировку.

Укажите фактический delimiter. В примере это запятая. Если экспорт использует точку с запятой, замените значение на ";". При неправильном разделителе вся строка заголовков способна прочитаться как одна колонка. Не переименовывайте её вслепую в одно из обязательных полей.

Запустите проверку обязательных значений

Сохраните код как check_csv.py рядом с transcript.csv и запустите python check_csv.py. Если в системе команда называется python3, используйте её. Сначала попробуйте небольшой учебный файл, где специально оставили пустой speaker и добавили лишнее поле.

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

import csv
from pathlib import Path

required = {"timecode", "speaker", "text"}
with Path("transcript.csv").open(
    encoding="utf-8-sig", newline=""
) as source:
    reader = csv.DictReader(source, delimiter=",")
    headers = reader.fieldnames or []
    if len(headers) != len(set(headers)):
        raise ValueError("Повторяются имена колонок")
    if not required.issubset(headers):
        raise ValueError(f"Нет колонок: {required - set(headers)}")
    count = 0
    for record, row in enumerate(reader, start=1):
        count += 1
        if None in row:
            print(record, "лишние поля", row[None])
        missing = [key for key in required
                   if not (row.get(key) or "").strip()]
        if missing:
            print(record, "пустые поля", sorted(missing))
    print("Прочитано записей:", count)

Ошибку чтения или кодировки разбирайте отдельно. Не включайте errors="ignore" ради завершения: пропущенные символы способны изменить имена и цитаты. Если чтение завершилось без сообщений о полях, это подтверждает только проверенные условия схемы.

Отделите дефект структуры от ошибки распознавания

Пустой speaker может быть допустимым обозначением неизвестного участника в Вашем процессе. Тогда измените правило проверки и явно запишите это условие. Скрипт не должен выдавать удобную договорённость формата за факт об аудио.

Заполненный text способен содержать неверную цифру, а заполненный timecode — время вне длительности записи. Эта проверка не оценивает смысл, порядок времени и точность говорящего. Возьмите контрольные реплики из начала, середины и конца и сопоставьте их с записью.

Для поиска по текстовому архиву можно затем использовать SQLite FTS5. Для получения исходной основы доступна расшифровка аудио. Структурная проверка полезна между получением файла и дальнейшим анализом.

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

Учебный пример: что означают сообщения

Вымышленный CSV содержит три записи. Первая проходит правила, две другие требуют проверки структуры.

ЗаписьДанныеСообщение
1Все три поля заполненыСтруктурных замечаний нет
2speaker пустойПустое обязательное поле
3Есть четвёртое значение без заголовкаЛишнее поле
КолонкиИмена и уникальностьПроверить заголовокЗаписьОбязательные значенияРазобрать пропускиРепликаСодержание и времяСверить по записи
Успешное чтение таблицы и точность расшифровки проверяются разными способами.

Исправляйте причину сообщения в копии и повторяйте проверку. Не удаляйте проблемную запись только ради чистого отчёта.

Карточка проверки CSV

Рабочая заготовкаВыделите и скопируйте
Файл и версия: [имя]
Кодировка: [подтверждённая]
Разделитель: [символ]
Обязательные колонки: [список]
Допустим пустой говорящий: [да / нет]
Записей прочитано: [число]
Сообщения: [номер записи — причина]
Контроль по аудио: [таймкоды]
Исправленная копия: [имя]

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

Номер записи равен номеру строки в редакторе?

Не обязательно. Одно CSV-поле может содержать переносы и занимать несколько физических строк.

utf-8-sig автоматически распознаёт любую кодировку?

Нет. Этот вариант предназначен для UTF-8 с необязательной меткой BOM.

Можно исправить файл заменой всех запятых?

Нет. Запятые бывают частью реплики. Используйте правильный CSV-разбор и выясняйте фактический разделитель.

Проверка гарантирует правильность реплик?

Нет. Она проверяет заданную структуру и заполненность. Содержание сверяется с исходной записью.