Python 3: os.marche() chemins d'accès de fichier UnicodeEncodeError: 'utf-8' codec ne peut pas coder: les mères porteuses sont pas autorisés
Ce code:
for root, dirs, files in os.walk('.'):
print(root)
Me donne cette erreur:
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcc3' in position 27: surrogates not allowed
Comment puis-je marcher à travers une arborescence de fichiers sans se toxiques comme les chaînes?
qui version de python 3?
Python 3.4.0 (par défaut, Avril 11 2014, 13:05:11) sur Ubuntu 14.04. J'ai
ne
Qui fonctionne! Merci!
stackoverflow.com/questions/38147259/... a un peu plus d'explication détaillée de ce que le message d'erreur signifie.
Python 3.4.0 (par défaut, Avril 11 2014, 13:05:11) sur Ubuntu 14.04. J'ai
LANG=en_US.UTF-8
ne
print(root.encode("utf-8", "surrogateescape"))
ont aucun effet?Qui fonctionne! Merci!
stackoverflow.com/questions/38147259/... a un peu plus d'explication détaillée de ce que le message d'erreur signifie.
OriginalL'auteur Collin Anderson | 2014-12-08
Vous devez vous connecter pour publier un commentaire.
Sur Linux, les noms de fichiers sont "juste un tas d'octets', et ne sont pas nécessairement encodé dans un codage particulier. Python 3 tente de transformer le tout dans des chaînes Unicode. En agissant ainsi, les développeurs est venu avec un plan pour traduire des chaînes d'octets à Unicode et à l'arrière, sans perte, et sans connaître le codage d'origine. Ils ont utilisé partielle des substituts pour coder les "mauvais" octets, mais le normal UTF8 codeur ne pouvons pas les traiter lors de l'impression sur le terminal.
Pour exemple, voici un non-UTF8 chaîne d'octets:
Il peut être converti en Unicode sans perte:
Mais il ne peut pas être imprimé:
Vous aurez à comprendre ce que vous voulez faire avec des noms de fichiers par défaut d'encodages. Peut-être juste de les encoder à l'origine d'octets et de les décoder avec des inconnus de remplacement. L'utiliser pour afficher, mais garder le nom d'origine pour accéder au fichier.
os.walk
pouvez également prendre une chaîne d'octets et sera de retour chaînes d'octets au lieu de chaînes Unicode:Ensuite, vous pouvez décoder comme vous le souhaitez.
bad_string.encode('utf-8', 'surrogateescape').decode('ISO-8859-1')
Anderson Comment avez-vous détecter l'occurrence de la chaîne incorrecte, comment avez-vous attraper erreur?
Ce qui a fonctionné pour moi a été
"bad string".encode('utf-8', 'surrogateescape').decode('utf-8')
OriginalL'auteur Mark Tolonen
J'ai fini par passer dans une chaîne d'octets à
os.walk()
qui va apparemment de retour chaînes d'octets au lieu de l'inexactitude des chaînes unicodeOriginalL'auteur Collin Anderson
Filtre avec
sed
ougrep
:C'est sensible à la façon dont fou de vos noms de variable. La dernière version devrait convenir à la plupart des choses folles.
OriginalL'auteur Walker Hale IV