67 votes

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 "conversion du fichier".

J'aimerais faire l'équivalent de:

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

Merci!

54voto

DzinX Points 13452

Vous pouvez utiliser le module de 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 de fichier.

34voto

Staale Points 8795

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))
 

14voto

Merci pour les réponses, ça marche!

Et comme les fichiers source sont dans des 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

sourceFormats = ['ascii', 'iso-8859-1']
targetFormat = 'utf-8'
outputDir = 'converted'

def convertFile(fileName):
    print("Converting '" + fileName + "'...")
    for format in sourceFormats:
        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
# ...
 

Mais peut-être existe-t-il un meilleur moyen de deviner le format de chaque fichier source?

À votre santé!

2voto

Ricardo Points 108

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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X