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!

47
demandé sur DzinX 2008-10-10 17:50:26

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.

46
répondu DzinX 2016-09-17 13:21:16

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))
27
répondu Staale 2008-10-10 14:07:07

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)

12
répondu Sébastien RoccaSerra 2015-07-31 23:30:38

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
1
répondu Ricardo 2012-02-08 19:44:05

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.

1
répondu Mojtaba Khodadadi 2017-01-08 17:58:58