os.listdir возвращает странную строку имени файла со специальными символами

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

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

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

Кажется, все в порядке, но если я напишу

'á.csv' in ls
# False

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

Спасибо

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


person felipekare    schedule 01.02.2020    source источник


Ответы (2)


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

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
person korakot    schedule 01.02.2020
comment
Это работает. последняя нормализация не нужна, хотя и предпочтительна из соображений безопасности. - person felipekare; 01.02.2020

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

person Hurried-Helpful    schedule 01.02.2020
comment
ты прав! написанное 'í'.encode() возвращает \xc3\xad, а скопированное возвращает i\xcc\x81 Как я могу это исправить? Оба в utf-8, однако один кодирует í, а другой — знак ударения. Кроме того, в моем автономном Python проблема повторяется (я не знаю, почему раньше этого не было, но я отредактирую свой пост), так что, возможно, это что-то вроде listdir - person felipekare; 01.02.2020
comment
Вы можете избавиться от всех акцентов в именах файлов, если нет коллизий. Посмотрите здесь узнать как. - person Hurried-Helpful; 01.02.2020