os.listdir возвращает странную строку имени файла со специальными символами - PullRequest
2 голосов
/ 01 февраля 2020

Предположим, у меня есть следующие файлы в path, который находится на моем диске Google, подключенном к ноутбуку Colab Python 3:

(Здесь строка # представляет выходные данные)

ls = os.listdir(path)
print (ls)
# ['á.csv', 'b.csv']

Каждый кажется нормальным, но если я напишу

'á.csv' in ls
# False

Но должен вернуть True. Однако, если я повторяю последний код, но вместо того, чтобы писать 'á.csv', я копирую и вставляю его вручную из print (ls), он возвращает True.

Спасибо

ps: проблема не точно с этим именем файла, с несколькими именами файлов, которые содержат специальные символы (а именно í, á, é, ó, ñ)

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Вы можете нормализовать список файлов перед их сравнением.

from unicodedata import normalize
ls = [normalize('NFC', f) for f in os.listdir(path)]
# compare
normalize('NFC', 'á.csv') in ls
# or just 'á.csv' in ls
1 голос
/ 01 февраля 2020

Я полагаю, это потому, что некоторые символы c диакритиков в Юникоде имеют дубликаты. То есть, хотя некоторые символы выглядят одинаково, это могут быть разные символы с разными кодами. Попробуйте 'á'.encode() один раз, написав á и еще раз, вставив копию, как вы это сделали. Если байты выглядят по-разному, это потому, что это разные символы, которые выглядят одинаково.

...