python `os` возвращает файлы, которые` os` считает несуществующими

У меня есть коллекция файлов из старого хранилища файлов MAC OS. Я знаю, что существуют проблемы с именами файлов и путей к коллекции. Проблема связана с включением кодовой точки в путь, который, как мне кажется, был представлен как тире в исходной ОС, но Windows борется с кодовой точкой и либо включает в себя диакритический знак предыдущего символа, либо заменяет его на ?

Я пытаюсь найти способ установить "правду" о структуре файлов, чтобы быть уверенным, что я отвечаю за каждый файл.

Я исследовал файлы с помощью нескольких инструментов, и ничто не соответствует подсчетам. Я считаю, что следующее демонстрирует проблему.

 #!/usr/bin/env python
 # -*- coding: utf-8 -*-

 import os

 folder = "emails"

 b = os.listdir(folder)

 for f in b:
      print repr(f)
      print os.path.isfile(os.path.join(folder, f))

(Я должен отредактировать фактические имена файлов буквально)

Результаты в:-

'file(1)'
True
'file(2)'
True
'file(3)?'
False
'file(4)'
True

Интересующее имя файла file(3)?где нечетная кодовая точка была декодирована как ?и который оценивается как не являющийся файлом (или даже существующим через os.path.exists). Обратите внимание, что print repr(string) показывает, что он обрабатывает UTF-8, правильно закодирован ?,

Я могу скопировать вставить имя файла из папки, и он выглядит как: file(3) обратите внимание на полную остановку.

Я могу вставить строку в мой редактор (subl) и увидеть, что теперь у меня есть неотображаемый глиф кодовой точки для конечной кодовой точки

a = "file(3)"

print a
print repr(a)

Дает мне:

 file(3)
'file(3)\xef\x80\xa9'

Из этого я вижу, что нечетный код \xef\x80\xa9, В другом месте в наборе я также нахожу кодовую точку \xef\x80\xa8,

Я должен предположить, что os.listdir не возвращает необработанные значения кодовой точки, а зашифрованную строку (UTF-8?) с подстановкой кодовой точки, которая означает, что при проверке exists или же isfile его проверка на наличие неправильного имени файла, так как файл с подстановленным ? не существует.

Как мне безопасно работать с этими файлами? У меня около 40 в коллекции около 700 файлов.

2 ответа

Пришли ли файлы из кодировки Mac Roman (предположительно того, что использовал MacOS), или из обычной NFKD-формы UTF-8, которую использует Mac OS X?

Концепция нормальных форм Unicode - это та, с которой каждый программист должен быть знаком.... хотя очень немногие это знают. Я не могу сказать вам, что вам нужно знать об этом в отношении Python.

Попробуйте передать unicode в os.listdir:

folder = u"emails"
b = os.listdir(folder)

Это приведет к os.listdir вернуть список юникодов вместо strs.


К сожалению, чем больше я думаю об этом, тем меньше понимаю, почему это сработало. Каждая файловая система в конечном итоге хранит свои имена файлов в байтах с использованием некоторой кодировки. HDF +, например, хранит имена файлов в UTF-16. Так что имеет смысл, если os.listdir может вернуть эти необработанные байты наиболее легко без фальсификации. Но вместо этого, в этом случае, это выглядит как os.listdir может вернуть без изменений unicode, но не настоящие байты.

Если бы кто-то мог объяснить эту тайну, я был бы очень благодарен.

Другие вопросы по тегам