Python: конвертируем кодировку текстовых файлов в UTF-8
Я, и пожалуй это не удивительно, люблю аниме, как и многие в современном мире. Единственное — терпеть не могу русскую озвучку и предпочитаю смотреть с субтитрами. Но…большинство релизеров сидят на windows и совершенно не думаю о том, что существуют других ОС, для которых кодировка windows-1251 не то что не является родной, но и вообще корректно не отображается. Начав не так давно изучать python, стал думать о различных, полезных для «дома» скриптах, а прочитав на днях статью на хабре Приводим русские тексты на Mac OS X в одну кодировку Python-скриптом, как то оно меня подтолкнуло к написанию простенького скрипта, который бы этим и занимался. О нём и расскажу.
Сам скрипт достаточно простенький и небольшой, вот листинг:
#!/usr/bin/python # -*- coding: utf-8 -*- import os import sys import chardet def converter(filePath): if any([filePath.endswith(extension) for extension in '.srt,.ass,.txt'.split(',')]): with open(filePath, "rb") as F: text = F.read() enc = chardet.detect(text).get("encoding") if enc and enc.lower() != "utf-8": try: text = text.decode(enc) text = text.encode("utf-8") with open(filePath, "wb") as f: f.write(text) print u"%s сконвертирован." % filePath except: print u"Ошибка в имени файла: название содержит русские символы." else : print u"Файл %s находится в кодировке %s и не требует конвертирования." % (filePath, enc) print '-'*40 if __name__ == '__main__': if len(sys.argv[1:]) == 0: try: path = raw_input(u"Input path or file:") except KeyboardInterrupt: print u"Ввод отменён." sys.exit(0) else: path = sys.argv[1:][0] if os.path.isdir(path): last = path[-1] if last.endswith('/'): path = path else : path = path+"/" print path for (path, dirs, files) in os.walk(path): for file in files: filePath = path+file filePath = filePath.decode("utf-8") converter(filePath) elif os.path.isfile(path) : converter(path) sys.exit(0)
Скрипт проверяет входной файл на кодировку, если файл в кодировке, отличной от UTF-8 — конвертирует файл. Для корректной работы скрипта нам необходим модуль chardet. Его нужно скачать, ну а дальше всё просто — разархивируем модуль, через консоль заходим в эту директорию, допустим:
cd ~/Downloads/chardet-2.1.1
и выполнить команду:
python setup.py install
модуль достаточно быстро установится и скрипт будет полностью работоспособен.
Скрипт способен конвертировать как одиночный файл, так и всю директорию целиком (находя в ней только файлы с расширением srt, ass, txt). Примеры:
python converter.py '~/Downloads/Новая папка/ansi.srt'
python converter.py '~/Downloads/Новая папка/'
Если вызвать скрипт без аргументов, то вы получите приглашение ввести путь к директории или файлу.
Скрипт на github где жду ваших фиксов и дополнений.