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

j'ai beaucoup de fichiers et d'analyseurs. Ce que je dois faire, c'est enlever tous les symboles non utf-8 et mettre les données en mongodb. Actuellement, j'ai un code comme ceci.

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, j'obtiens toujours une erreur

bson.errors.InvalidStringData: strings in documents must be valid UTF-8: 
1/b62010montecassianomcirxe2x86x90ta0xe2x86x90008923304320733/290066010401040101506055soccorin

je ne peux pas l'obtenir. Est-il une façon simple de le faire?

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

24
demandé sur maudulus 2014-10-24 09:24:20

4 réponses

essayez sous la ligne de code au lieu des deux dernières lignes. Espérons que cela aide:

line=line.decode('utf-8','ignore').encode("utf-8")
45
répondu Irshad Bhat 2016-03-11 09:43:35

Pour python 3, comme mentionné dans un commentaire dans ce fil, que vous pouvez faire:

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

le paramètre' ignore ' empêche une erreur d'être soulevée si des caractères ne peuvent pas être décodés.

si votre ligne est déjà un objet bytes (par exemple b'my string'), alors vous avez juste besoin de le décoder avec decode('utf-8', 'ignore').

14
répondu AlexG 2017-04-27 06:19:34

exemple pour traiter 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
répondu Shafiq 2017-01-05 05:23:13
with open(fname, "r") as fp:
for line in fp:
    line = line.strip()
    line = line.decode('cp1252').encode('utf-8')
0
répondu Willem 2018-07-28 05:04:34