web-dev-qa-db-fra.com

Supprimer tous les symboles non-utf-8 de la chaîne

J'ai une grande quantité de fichiers et d'analyseur. Ce que je dois faire est de supprimer tous les symboles non utf-8 et de mettre les données dans mongodb. Actuellement, j'ai un code comme celui-ci. 

with open(fname, "r") as fp:
    for line in fp:
        line = line.strip()
        line = line.decode('utf-8', 'ignore')
        line = line.encode('utf-8', 'ignore')

en quelque sorte je reçois toujours une erreur

bson.errors.InvalidStringData: strings in documents must be valid UTF-8: 
1/b62010montecassianomcir\xe2\x86\x90ta0\xe2\x86\x90008923304320733/290066010401040101506055soccorin

Je ne comprends pas. Y a-t-il un moyen simple de le faire? 

UPD: semble que Python et Mongo ne sont pas d'accord sur la définition de la chaîne Utf-8 Valid.

28
Darth Kotik

Essayez ci-dessous la ligne de code au lieu des deux dernières lignes. J'espère que ça aide:

line=line.decode('utf-8','ignore').encode("utf-8")
52
Irshad Bhat

Pour Python 3, comme mentionné dans un commentaire de ce fil, vous pouvez faire:

line = bytes(line, 'utf-8').decode('utf-8', 'ignore')

Le paramètre 'ignore' empêche qu'une erreur ne soit générée si aucun caractère ne peut être décodé.

Si votre ligne est déjà un objet octet (par exemple b'my string'), il vous suffit de la décoder avec decode('utf-8', 'ignore').

14
AlexG

Exemple pour ne gérer aucun caractère utf-8

import string

test=u"\n\n\n\n\n\n\n\n\n\n\n\n\n\nHi <<First Name>>\nthis is filler text \xa325 more filler.\nadditilnal filler.\n\nyet more\xa0still more\xa0filler.\n\n\xa0\n\n\n\n\nmore\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfiller.\x03\n\t\t\t\t\t\t    almost there \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nthe end\n\n\n\n\n\n\n\n\n\n\n\n\n"

print ''.join(x for x in test if x in string.printable)
1
Shafiq
with open(fname, "r") as fp:
for line in fp:
    line = line.strip()
    line = line.decode('cp1252').encode('utf-8')
0
Willem