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