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