J'ai écrit le programme python le plus simple qui présente l'erreur pour laquelle j'ai besoin d'aide.Le fichier python open() déclenche une exception pour le caractère non utf-8
lines_read = 0
urllist_file = open('../fall11_urls.txt', 'r')
for line in urllist_file:
lines_read += 1
print('line count:', lines_read)
je lance ceci sur la plupart des fichiers et bien sûr, il fonctionne comme prévu, mais « fall11_urls.txt » est un fichier texte de 14 millions de ligne qui contient des URL, une par ligne. Certaines de ces lignes contiennent du texte avec des caractères qui ne sont pas utf-8 et je reçois l'erreur citée ci-dessous. J'ai besoin d'accéder à chacune de ces URL Quelle est la meilleure façon de gérer cela. Ces URL peuvent être "quelque chose" certains sont 400 caractères de caractères aléatoires comme dans "https://bbswigr.fty.com/_Kcsnuk4J71A/RjzGhXZGmfI/AAAARg/xP3FO-Xbt68/s320/Axolo.jpg Certains de ces caractères contiennent des chaînes telles que 0x96 J'ai besoin de mon programme python pour être robuste contre tout ce qui pourrait être dans le fichier. Ubuntu 16.04)
Voici l'erreur
Traceback (most recent call last):
File "./count_lines.py", line 2, in <module>
for line in urllist_file:
File "/home/chris/.virtualenvs/cvml3/lib/python3.5/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 5529: invalid start byte
un bit d'information iconv trouve le même problème avec le même dossier. Voir ci-dessous
$ iconv ../fall11_urls.txt >> /dev/null
iconv: illegal input sequence at position 1042953625
Mon travail actuel est d'environ UGLY. I utilisez iconv pour trouver le problème t Alors je main édite le fichier dans vi, puis le traite. et continuez à le faire jusqu'à ce qu'il soit propre mais j'ai des MILLIONS de lignes dans de nombreux fichiers à traiter. Et les URL fonctionnent surtout après que je les corrige à la main, donc ce ne sont pas du bruit ou des "bits retournés".
Lire en tant que binaire, puis le décoder dans votre format requis – crook
IMO le plus sain est d'utiliser 'errors = 'surrogateescape''. Il n'y a pas de * bons * moyens. – o11c