Python encode file to utf 8

Как преобразовать файл в UTF-8 в Python?

Мне нужно преобразовать кучу файлов в utf-8 в Python, и у меня возникают проблемы с частью «преобразования файла». Я хотел бы сделать эквивалент:

iconv -t utf-8 $file > converted/$file # this is shell code 

7 ответов

import codecs BLOCKSIZE = 1048576 # or some other, desired size in bytes with codecs.open(sourceFileName, "r", "your-source-encoding") as sourceFile: with codecs.open(targetFileName, "w", "utf-8") as targetFile: while True: contents = sourceFile.read(BLOCKSIZE) if not contents: break targetFile.write(contents) 

read () всегда будет читать весь файл — вы, вероятно, захотите .read (BLOCKSIZE), где BLOCKSIZE — это некоторое подходящее количество для чтения / записи одновременно.

Это сработало для меня в небольшом тесте:

sourceEncoding = "iso-8859-1" targetEncoding = "utf-8" source = open("source") target = open("target", "w") target.write(unicode(source.read(), sourceEncoding).encode(targetEncoding)) 

@Honghe.Wu:Honghe.Wu: В Windows текстовый режим используется по умолчанию, и это означает, что окончания строк будут искажены операционной системой, чего вы не хотите, если не уверены в кодировке на диске.

@Arafangion Как будет выглядеть пример, если я хочу указать бинарный режим? target = open(«target», «wb») есть еще какие-то изменения?

Спасибо за ответы, он работает!

И поскольку исходные файлы находятся в смешанных форматах, я добавил список исходных форматов, которые будут проверяться последовательно ( sourceFormats ), а в UnicodeDecodeError я попробую следующий формат:

from __future__ import with_statement import os import sys import codecs from chardet.universaldetector import UniversalDetector targetFormat = 'utf-8' outputDir = 'converted' detector = UniversalDetector() def get_encoding_type(current_file): detector.reset() for line in file(current_file): detector.feed(line) if detector.done: break detector.close() return detector.result['encoding'] def convertFileBestGuess(filename): sourceFormats = ['ascii', 'iso-8859-1'] for format in sourceFormats: try: with codecs.open(fileName, 'rU', format) as sourceFile: writeConversion(sourceFile) print('Done.') return except UnicodeDecodeError: pass def convertFileWithDetection(fileName): print("Converting '" + fileName + "'. ") format=get_encoding_type(fileName) try: with codecs.open(fileName, 'rU', format) as sourceFile: writeConversion(sourceFile) print('Done.') return except UnicodeDecodeError: pass print("Error: failed to convert '" + fileName + "'.") def writeConversion(file): with codecs.open(outputDir + '/' + fileName, 'w', targetFormat) as targetFile: for line in file: targetFile.write(line) # Off topic: get the file list and call convertFile on each file # . 

(EDIT by Rudro Badhon: это включает в себя оригинальную попытку нескольких форматов, пока вы не получите исключение, а также альтернативный подход, использующий chardet.universaldetector)

Читайте также:  Get list methods php

В сложных случаях вы можете попытаться определить кодировку с помощью модуля chardet с feedparser.org, но в вашем случае это излишнее.

Источник

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. Его нужно скачать, ну а дальше всё просто — разархивируем модуль, через консоль заходим в эту директорию, допустим:

модуль достаточно быстро установится и скрипт будет полностью работоспособен.
Скрипт способен конвертировать как одиночный файл, так и всю директорию целиком (находя в ней только файлы с расширением srt, ass, txt). Примеры:

python converter.py '~/Downloads/Новая папка/ansi.srt'
python converter.py '~/Downloads/Новая папка/'

Если вызвать скрипт без аргументов, то вы получите приглашение ввести путь к директории или файлу.

Скрипт на github где жду ваших фиксов и дополнений.

Источник

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. Его нужно скачать, ну а дальше всё просто — разархивируем модуль, через консоль заходим в эту директорию, допустим:

модуль достаточно быстро установится и скрипт будет полностью работоспособен.
Скрипт способен конвертировать как одиночный файл, так и всю директорию целиком (находя в ней только файлы с расширением srt, ass, txt). Примеры:

python converter.py '~/Downloads/Новая папка/ansi.srt'
python converter.py '~/Downloads/Новая папка/'

Если вызвать скрипт без аргументов, то вы получите приглашение ввести путь к директории или файлу.

Скрипт на github где жду ваших фиксов и дополнений.

Источник

Оцените статью