Расшифровка в CSV: как сохранить кавычки, запятые и переносы через Python
Как перенести реплики в CSV через модуль csv Python: поля, UTF-8, кавычки, переносы внутри текста и проверка обратного чтения. Учебный пример.
Определите единицу строки и набор полей
CSV удобен, когда расшифровку нужно передать в таблицу или собственную систему анализа. Сначала решите, чему соответствует одна запись: отдельной реплике, абзацу или выбранной цитате. Не меняйте это правило посреди одного файла без явного признака типа строки.
Получите текст аудио и подготовьте поля: id, timecode, speaker, text. Идентификатор нужен для устойчивой ссылки, время — для возвращения к записи, метка участника — для группировки. Не выводите личность человека из технической метки вроде У01.
Сохраняйте таймкод строкой в исходном формате. В CSV нет собственного типа времени, а табличный редактор может автоматически изменить отображение. Это отдельная проблема импорта; корректный CSV не гарантирует, что программа получателя выбрала нужный тип колонки.
Поручите кавычки стандартному модулю
В Python модуль csv умеет записывать поля с разделителями, кавычками и переносами. Откройте файл для записи с encoding="utf-8" и newline="". Передайте список полей в writer, не формируйте строку через ",".join(...).
Если текст содержит запятую, модуль заключит нужное поле в кавычки. Внутренняя двойная кавычка обрабатывается по правилам выбранного диалекта. Это часть структуры файла, а не новая пунктуация реплики. После корректного чтения возвращается исходное значение.
В шаблоне ниже используется DictWriter с четырьмя колонками и стандартным разделителем — запятой. Если получателю нужен другой разделитель, задайте его явно при записи и чтении. Не полагайтесь на то, что любая программа угадает диалект.
Не считайте физические строки числом реплик
Внутри одного текстового поля может находиться перенос строки. Корректный CSV сохраняет его внутри записи в кавычках. Поэтому файл с двумя репликами способен занимать больше трёх физических строк с учётом заголовка.
Прочитайте результат через DictReader с теми же правилами разделения. Сравните количество записей, названия колонок и значения поля text. Особое внимание уделите строкам с запятыми, кавычками и переносами: именно они обнаруживают ошибку ручной склейки.
Если текст открывается в одной колонке, сначала проверьте выбор разделителя в программе импорта. Если кавычки остаются как лишние символы внутри значения, убедитесь, что файл читается CSV-парсером, а не простым разделением каждой строки по запятой.
Проверьте содержимое после переноса в таблицу
Откройте CSV в целевой программе и проверьте таймкод, метку участника и текст отдельно. Найдите последнюю запись и убедитесь, что всё содержание сохранилось. Внешне правильное число колонок не показывает, что редактор не преобразовал значение автоматически.
Сравните несколько реплик с исходником, включая отрицания и числа. Для содержательных редакций пригодится проверка смысла изменений. Перенос формата должен оставаться отделённым от сокращения разговора.
CSV — текстовая таблица без истории обсуждений, оформления и аудио. Если команда передаёт также запись, укажите связь через идентификатор исходника в отдельной карточке. Создание файла csv не делает его готовым архивом всей встречи.
Учебный пример: проверка на коротком фрагменте
Ниже вымышленная запись. Имена, время и содержание нужны только для объяснения порядка работы.
| Поле | Учебное значение | Проверка |
|---|---|---|
| timecode | 00:01:20 | Сохранить как текст |
| speaker | У01 | Это метка, не проверенное имя |
| text | Сказал: «Да, но позже». | Кавычки и запятая не разбивают поле |
Повторите проверку на своей копии записи. Учебные значения не описывают Ваш файл и не подтверждают качество всей расшифровки.
Заготовка для собственной проверки
import csv
rows = [
{"id": "r1", "timecode": "00:01:20", "speaker": "У01",
"text": 'Сказал: "Да, но позже".'},
{"id": "r2", "timecode": "00:01:25", "speaker": "У02",
"text": "Первая строка\nУточнение"},
]
fields = ["id", "timecode", "speaker", "text"]
with open("transcript.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fields)
writer.writeheader()
writer.writerows(rows)
with open("transcript.csv", encoding="utf-8", newline="") as f:
restored = list(csv.DictReader(f))
assert restored == rowsЧастые вопросы
Можно склеить поля через запятую?
Не для произвольного текста: запятые и кавычки внутри реплики нарушат такую схему.
Почему число строк не совпадает с числом реплик?
Внутри поля может быть перенос строки; считайте записи через CSV-парсер.
UTF-8 сохраняет русский текст?
Да, при соответствующем чтении. Выбор кодировки в программе импорта тоже важен.
CSV хранит время как специальный тип?
Нет. Типы интерпретирует программа получателя.