загружаю

This commit is contained in:
2026-09-07 19:07:40 +03:00
commit 1485819556
16 changed files with 1526 additions and 0 deletions
+150
View File
@@ -0,0 +1,150 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
r"""
names.py — сбор уникальных имён спикеров из .nsv файлов в CSV-таблицу
для перевода, и обратное применение переведённых имён в .nsv файлы.
Файлы .nsv всегда в UTF-8 (пишутся convert.py/translate.py) — здесь нет
нужды в автоопределении кодировки, в отличие от более ранней версии этого
скрипта, где угадывание cp932/shift_jis/utf-8 могло молча испортить текст
на символах вроде "", которых нет в cp932, но которые cp932 способен
"прочитать" без ошибки, просто дав кракозябры.
"""
import csv
from pathlib import Path
from nsv_io import load_nsv_file, save_nsv_file
def get_target_dir():
folder_input = input("Укажите путь к папке с .nsv файлами [по умолчанию: translate]: ").strip()
folder_path = folder_input.strip('"\'') if folder_input else "translate"
target_dir = Path(folder_path)
if not target_dir.is_dir():
print(f"Ошибка: папка '{target_dir}' не найдена.\n")
return None
return target_dir
def mode_extract():
target_dir = get_target_dir()
if not target_dir:
return
nsv_files = list(target_dir.rglob("*.nsv"))
if not nsv_files:
print(f"В папке '{target_dir}' не найдено файлов .nsv.\n")
return
print(f"Найдено .nsv файлов: {len(nsv_files)}. Сбор имён...")
unique_speakers = set()
for file_path in nsv_files:
try:
entries = load_nsv_file(file_path)
except Exception as e:
print(f"Пропуск файла {file_path.name} (не удалось прочитать: {e})")
continue
for e in entries:
speaker = e.get("speaker")
if speaker is not None and speaker.strip():
unique_speakers.add(speaker.strip())
output_csv = Path(__file__).resolve().parent / "namestable.csv"
sorted_speakers = sorted(unique_speakers)
with open(output_csv, "w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f)
writer.writerow(["Original", "Translated"])
for speaker in sorted_speakers:
writer.writerow([speaker, ""])
print(f"\nГотово! Уникальных имён собрано: {len(sorted_speakers)}")
print(f"Файл сохранён: {output_csv}\n")
def mode_apply():
csv_path = Path(__file__).resolve().parent / "namestable.csv"
if not csv_path.is_file():
print(f"Ошибка: файл '{csv_path.name}' рядом со скриптом не найден.\n")
return
translation_map = {}
with open(csv_path, "r", encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
for row in reader:
orig = row.get("Original", "").strip()
trans = row.get("Translated", "").strip()
if orig and trans:
translation_map[orig] = trans
if not translation_map:
print("В таблице namestable.csv нет заполненных колонок 'Translated'. Нечего применять.\n")
return
print(f"Загружено переводов для замены: {len(translation_map)}")
target_dir = get_target_dir()
if not target_dir:
return
nsv_files = list(target_dir.rglob("*.nsv"))
if not nsv_files:
print(f"В папке '{target_dir}' не найдено файлов .nsv.\n")
return
print(f"Обработка {len(nsv_files)} файлов...")
total_replaced = 0
modified_files = 0
for file_path in nsv_files:
try:
entries = load_nsv_file(file_path)
except Exception as e:
print(f"Пропуск {file_path.name}: не удалось прочитать ({e}).")
continue
replaced_in_file = 0
for e in entries:
speaker = e.get("speaker")
if speaker is not None:
raw_val = speaker.strip()
if raw_val in translation_map:
e["speaker"] = translation_map[raw_val]
replaced_in_file += 1
if replaced_in_file > 0:
save_nsv_file(file_path, entries)
total_replaced += replaced_in_file
modified_files += 1
print(f"\nГотово!")
print(f"Изменено файлов: {modified_files}")
print(f"Всего произведено замен: {total_replaced}\n")
def main():
while True:
print("=== Меню ===")
print("1. Собрать уникальные имена в namestable.csv")
print("2. Применить перевод из namestable.csv обратно в .nsv")
print("0. Выход")
choice = input("Выберите действие [1/2/0]: ").strip()
print()
if choice == "1":
mode_extract()
elif choice == "2":
mode_apply()
elif choice == "0":
break
else:
print("Неверный ввод, попробуйте снова.\n")
if __name__ == "__main__":
main()