109 votes

Convertir UTF-8 avec nomenclature en UTF-8 sans nomenclature en Python

Deux questions à ce sujet. J'ai un ensemble de fichiers qui sont généralement UTF-8 avec BOM. J'aimerais les convertir (idéalement en place) en UTF-8 sans nomenclature. Il semble que codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors) s'en chargerait. Mais je ne vois pas vraiment de bons exemples d'utilisation. Est-ce que c'est la meilleure façon de gérer cela ?

source files:
Tue Jan 17$ file brh-m-157.json 
brh-m-157.json: UTF-8 Unicode (with BOM) text

De plus, il serait idéal que nous puissions gérer différents encodages d'entrée sans le savoir explicitement (comme ASCII et UTF-16). Il semble que tout cela soit faisable. Existe-t-il une solution capable de prendre n'importe quel encodage Python connu et de le restituer en UTF-8 sans BOM ?

modifier 1 proposition de sol'n par le bas (merci !)

fp = open('brh-m-157.json','rw')
s = fp.read()
u = s.decode('utf-8-sig')
s = u.encode('utf-8')
print fp.encoding  
fp.write(s)

Cela me donne l'erreur suivante :

IOError: [Errno 9] Bad file descriptor

Flash info

On me dit dans les commentaires que l'erreur vient du fait que j'ouvre le fichier avec le mode 'rw' au lieu de 'r+'/'r+b', donc je devrais éventuellement rééditer ma question et supprimer la partie résolue.

4voto

wcc526 Points 153

Vous pouvez utiliser des codecs.

import codecs
with open("test.txt",'r') as filehandle:
    content = filehandle.read()
if content[:3] == codecs.BOM_UTF8:
    content = content[3:]
print content.decode("utf-8")

1voto

En python3, vous devez ajouter encoding='utf-8-sig' :

with open(file_name, mode='a', encoding='utf-8-sig') as csvfile:
    csvfile.writelines(rows)

c'est tout.

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