Comment convertir un fichier en utf-8 en Python?
j'ai besoin de convertir un tas de fichiers en utf-8 en Python, et j'ai des problèmes avec la partie" convertir le fichier".
j'aimerais faire l'équivalent de:
iconv -t utf-8 $file > converted/$file # this is shell code
Merci!
5 réponses
vous pouvez utiliser le module codecs , comme ceci:
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)
EDIT : ajout du paramètre BLOCKSIZE
pour contrôler la taille du fragment du fichier.
cela a fonctionné pour moi dans un petit test:
sourceEncoding = "iso-8859-1"
targetEncoding = "utf-8"
source = open("source")
target = open("target", "w")
target.write(unicode(source.read(), sourceEncoding).encode(targetEncoding))
Merci pour les réponses, ça fonctionne!
et puisque les fichiers source sont en formats mixtes, j'ai ajouté une liste de formats source à essayer en séquence ( sourceFormats
), et sur UnicodeDecodeError
j'essaie le format suivant:
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
# ...
(édité par Rudro Badhon: ceci incorpore les formats try multiple originaux jusqu'à ce que vous n'obtenez pas une exception ainsi qu'une approche alternative qui utilise chardet.universaldetector)
pour deviner quel est le codage source, vous pouvez utiliser la commande file
*nix.
exemple:
$ file --mime jumper.xml
jumper.xml: application/xml; charset=utf-8
c'est une fonction Python3 pour convertir n'importe quel dossier de texte dans celui avec l'encodage UTF-8. (sans utiliser de colis inutiles)
def correctSubtitleEncoding(filename, newFilename, encoding_from, encoding_to='UTF-8'):
with open(filename, 'r', encoding=encoding_from) as fr:
with open(newFilename, 'w', encoding=encoding_to) as fw:
for line in fr:
fw.write(line[:-1]+'\r\n')
Vous pouvez l'utiliser facilement dans une boucle de convertir une liste de fichiers.