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

Добавить комментарий