Comment remplacer tous les '0xa0' caractères ' dans un tas de fichiers texte?
j'ai essayé de masse pour modifier un tas de fichiers texte au format utf-8 en python et cette erreur ne cesse d'apparaître. est-il un moyen de les remplacer dans certains python scripts ou des commandes bash?
j'ai utilisé le code:
writer = codecs.open(os.path.join(wrd, 'dict.en'), 'wtr', 'utf-8')
for infile in glob.glob(os.path.join(wrd,'*.txt')):
print infile
for line in open(infile):
writer.write(line.encode('utf-8'))
et a obtenu ces sortes d'erreurs:
Traceback (most recent call last):
File "dicting.py", line 30, in <module>
writer.write(line2.encode('utf-8'))
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 216: unexpected code byte
Pourquoi n'utilisez-vous pas iconv?
Avez-vous une idée de ce qui est l'encodage utilisé dans les fichiers d'entrée?
Avez-vous une idée de ce qui est l'encodage utilisé dans les fichiers d'entrée?
OriginalL'auteur alvas | 2011-03-25
Vous devez vous connecter pour publier un commentaire.
OK, premier point: votre fichier de sortie est réglée automatiquement encode le texte écrit comme
utf-8
, afin de ne pas prévoir de façon expliciteencode('utf-8')
appel de la méthode lors du passage d'arguments à lawrite()
méthode.Donc la première chose à faire est d'essayer d'utiliser simplement les lignes suivantes dans votre boucle intérieure:
Si cela ne fonctionne pas, alors le problème est presque certainement le fait que, comme d'autres l'ont noté, vous n'êtes pas décodage votre entrée fichier correctement.
Prendre un sauvage deviner, et en supposant que les fichiers sont encodés en
cp1252
, vous pouvez essayer un test rapide au suivant dans la boucle intérieure:Point mineur: 'wtr" est un non-sens la chaîne de mode (comme l'accès en écriture implique un accès en lecture). Simplifier il soit " wt "ou même simplement "w".
latin1
ou inconnu, ou il n'y a aucune mention d'un tel concept, alors sûrement que l'encodage estcp1252
, à moins bien sûr que le fichier est ancienne, auquel cas le codage estcp850
oucp437
, à moins bien sûr que les résultats de fichier à partir de la concaténation de beaucoup d'autres, auquel cas le codage peut bien être un fubarred mélange.L'horrible chose à propos de
latin1
est questr.decode('latin1')
ne sera jamais soulever une exception se plaindre d'un unmapped octet, et "ne pas soulever une exception" est souvent confondue avec les "œuvres" dans ce cou des bois.Bon point, j'ai changé le sauvage deviner à
cp1252
. Malheureusement, l'OP a déjà accepté la tête dans le sable "ignorer les erreurs qui essaient de vous dire quelque chose d'important" réponse 😛Merci pour le cp1252 encodage. Épargnant de vie!
OriginalL'auteur ncoghlan
Ne vous omettez un peu de code? Vous êtes en train de lire dans
line
mais en essayant de ré-encoderline2
.Dans tous les cas, vous allez avoir à dire à Python que l'encodage du fichier d'entrée est; si vous ne connaissez pas, alors vous aurez à ouvrir raw et effectuer des substitutions sans l'aide d'un codec.
j'ai essayé line2 = ligne.replace('\xa0', ' ')
mais cela n'a pas fonctionné
OriginalL'auteur geekosaur
Veuillez être grave, un simple replace() de l'opération sera de faire le travail:
En plus des codecs.open() les constructeurs de soutenir les "erreurs" de paramètre à gérer
des erreurs de conversion. Veuillez lire (vous-même).
0xA0
dans lechr
fonction pour que cela fonctionne. Sinon, vous recevrez un message d'erreur:TypeError: expected a character buffer object
Traceback (most recent call last): File "dicting.py", à la ligne 28, in <module> ligne = ligne.remplacer(0xa0, ' ') TypeError: prévu un tampon de caractères de l'objet
comment puis-je le passer à la fonction chr?
est-ce la fonction vous êtes en train de parler? si non, pouvez-vous me conduire à une page web. merci! java2s.com/Code/Python/Buildin-Function/chr.htm
-1 en général, vous voulez remplacer la! par la un ESPACE, pas de le supprimer. Dans tous les cas, l'OP semble vouloir encoder ses données à partir d'une inconnue de l'encodage UTF-8, pas de mutilation.
OriginalL'auteur Andreas Jung