Чтение CSV-расшифровки через Python: как проверить колонки и пустые реплики
Проверка CSV перед анализом: DictReader, кодировка UTF-8, разделитель, обязательные поля и лишние значения. Рабочий скрипт, который не меняет исходный файл.
Определите схему файла до запуска
Этот способ подходит для таблицы, где каждая запись содержит таймкод, говорящего и текст реплики. Он нужен перед поиском, группировкой или переносом данных в другой инструмент. Пустая колонка и сдвиг значений могут испортить анализ даже при читаемом внешнем виде таблицы.
Учебная схема использует имена 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 | Все три поля заполнены | Структурных замечаний нет |
| 2 | speaker пустой | Пустое обязательное поле |
| 3 | Есть четвёртое значение без заголовка | Лишнее поле |
Исправляйте причину сообщения в копии и повторяйте проверку. Не удаляйте проблемную запись только ради чистого отчёта.
Карточка проверки CSV
Файл и версия: [имя] Кодировка: [подтверждённая] Разделитель: [символ] Обязательные колонки: [список] Допустим пустой говорящий: [да / нет] Записей прочитано: [число] Сообщения: [номер записи — причина] Контроль по аудио: [таймкоды] Исправленная копия: [имя]
Частые вопросы
Номер записи равен номеру строки в редакторе?
Не обязательно. Одно CSV-поле может содержать переносы и занимать несколько физических строк.
utf-8-sig автоматически распознаёт любую кодировку?
Нет. Этот вариант предназначен для UTF-8 с необязательной меткой BOM.
Можно исправить файл заменой всех запятых?
Нет. Запятые бывают частью реплики. Используйте правильный CSV-разбор и выясняйте фактический разделитель.
Проверка гарантирует правильность реплик?
Нет. Она проверяет заданную структуру и заполненность. Содержание сверяется с исходной записью.