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 где жду ваших фиксов и дополнений.