2010-11-28 41 views
21

Je suis en train d'écrire un script en python pour convertir les fichiers utf-8 dans des fichiers ASCII:script Python pour convertir UTF-8 en ASCII

#!/usr/bin/env python 
# *-* coding: iso-8859-1 *-* 

import sys 
import os 

filePath = "test.lrc" 
fichier = open(filePath, "rb") 
contentOfFile = fichier.read() 
fichier.close() 

fichierTemp = open("tempASCII", "w") 
fichierTemp.write(contentOfFile.encode("ASCII", 'ignore')) 
fichierTemp.close() 

Quand je lance ce script, j'ai l'erreur suivante :

UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 13: ordinal not in range(128)

Je pensais que peut ignorer l'erreur avec le paramètre ignorer dans la méthode encode. Mais ça ne semble pas.

Je suis ouvert à d'autres façons de convertir.

+2

Le problème est que vous ne décoderez jamais en premier lieu. –

+0

Vous avez reçu l'erreur car le caractère n'existe pas dans le jeu de caractères ASCII, il ne peut donc pas être converti. Parfois, vous pouvez mapper le caractère UTF8 à un caractère visuel le plus proche en ASCII, comme 'é' à' e', mais cela peut changer la signification des mots. Vous devez décider si ce chemin fonctionnera pour votre application. –

+0

Cela semble être une très mauvaise idée !! – tchrist

Répondre

38
data="UTF-8 DATA" 
udata=data.decode("utf-8") 
asciidata=udata.encode("ascii","ignore") 
+13

Cela ressemble à une mauvaise recette pour la perte de données. – tchrist

+31

Vous devriez vous attendre à une perte de données si vous souhaitez convertir un encodage 8 bits en 7 bits. –

+3

J'ai ignoré que je dois d'abord décoder. Cela fonctionne maintenant merci. Pour répondre aux questions, je veux le faire parce que mon lecteur MP3 ne peut afficher que les fichiers de paroles encodés en ASCII. – Nicolas

6
import codecs 

... 

fichier = codecs.open(filePath, "r", encoding="utf-8") 

... 

fichierTemp = codecs.open("tempASCII", "w", encoding="ascii", errors="ignore") 
fichierTemp.write(contentOfFile) 

... 
+0

Merci pour votre solution, cela fonctionne aussi !!! – Nicolas

5

UTF-8 est un ensemble de l'ASCII. Soit votre fichier UTF-8 est ASCII, soit il ne peut pas être converti sans perte.

+8

Je pense qu'il en est conscient, sinon il n'essaierait pas d'utiliser "ignore". –

+1

@Ignacio Vrai. Mais celui-ci m'a laissé me demander ce que le demandeur essaie d'accomplir. Ils pourraient être en train de mettre en culture des cargaisons, ou peut-être que leur besoin est mieux comblé par quelque chose comme l'urlencode, ou être en perte de temps est juste acceptable. – Tobu

+0

J'ai peur de la culture de la cargaison. Culling tous les caractères que vous n'avez pas apprécié est vraiment insensible. – tchrist