2016-03-19 3 views
3

Genau der gleiche Code, lief auf Mac OS X und CentOS 7 unterschiedliche Ergebnisse:os.walk gibt anders codierte nicht-ASCII (Unicode) Dateinamen, wie damit umzugehen?

>>> path = u'examples' 
>>> import os 
>>> walker = os.walk(path, followlinks=True) 
>>> list(walker) 

Auf CentOS:

[u'filename-with-un\xec\u010d\xf8\u0111e-chars.txt', ... ] 

Auf MacOSX:

[u'filename-with-uni\u0300c\u030c\xf8\u0111e-chars.txt', ... ] 

BTW, Die eigentliche Datei Name ist filename-with-unìčøđe-chars.txt

Was verursacht dies sein Verhalten, und wie können wir es vermeiden?

+3

Haben Sie diese Methode untersucht: https://docs.python.org/2/library/unicodedata.html#unicodedata.normalize –

+0

@ JeremyJStarcher NEIN! Ich HABE! BIS JETZT! UND JETZT FUNKTIONIERT DAS! Und ich werde meinen CAPSLOCK irgendwann MORGEN, wahrscheinlich! DANKE !!! 111 – frnhr

Antwort

1

Das Verhalten wird durch verschiedene Unicode-Normalisierungsformulare für Dateinamen unter OS X und Cent OS verursacht.

Die Technical Report #15 von unicode.org definiert die verfügbaren Formulare, aber Apple verwendet eine leichte Variante für HFS + wie dokumentiert here.

Also in einem Fall haben Sie NFD unter OS X/HFS +, und in der anderen haben Sie NFC für Linux (wenn Sie in dem glücklichen Fall sind, dass Ihr Dateisystem Kodierung überhaupt für Linux ist, was nicht immer ist der Fall, siehe Wheeler für eine Menge der Probleme, die Sie finden könnten).

Also grundsätzlich können Sie das Verhalten nicht vermeiden, es ist das native Dateisystem, das das tut.

Aber wenn Sie anders fragen, erhalten Sie möglicherweise eine befriedigendere Antwort. Sie können die Namen auf sinnvolle Weise vergleichen, indem Sie entweder auf ein normales Normalisierungsformular normalisieren usw., abhängig davon, warum Sie sie vergleichen müssen. Python bietet Normalisierungsfunktionen im Modul unicodedata mit der Funktion normalize() an.

Verwandte Themen