Gracias por las respuestas, funciona!
Y puesto que los archivos de origen están en formatos mixtos, he añadido una lista de formatos de origen para ser juzgados en secuencia (sourceFormats
), y en UnicodeDecodeError
que pruebe con el siguiente formato:
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 Rudro Badhon: esto incorpora el intento original de múltiples formatos hasta que no obtenga una excepción, así como un enfoque alternativo que usa el detector de tipo chardet.universal)
read() leerá siempre el archivo completo; probablemente desee .read (BLOCKSIZE), donde BLOCKSIZE es una cantidad adecuada para leer/escribir a la vez. – Brian
Eso es cierto, gracias. Voy a modificar mi ejemplo. – DzinX