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.
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")
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')
.
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)
with open(fname, "r") as fp:
for line in fp:
line = line.strip()
line = line.decode('cp1252').encode('utf-8')