Как я могу использовать имя файла utf-8, полученное из файла YAML для os.path.isdir ()? - PullRequest
0 голосов
/ 19 января 2019

Я загружаю путь к папке из файла config.yml.Имя примера: C:/Users/Name/Desktop/ü, которое содержит символ utf-8.Когда я загружаю этот путь, используя yaml.load(config) (я использую ruamel.yaml), а затем использую загруженное значение, чтобы проверить, существует ли этот каталог с os.path.isdir(), я всегда получаю "False", даже если файл существует.(в Windows)

Однако, когда я пытаюсь проверить, существует ли файл с жестко закодированной строкой, такой как root_path = 'C:/Users/Name/Desktop/ü', я получаю "True".

Я сбросил данные (python dict) в файл конфигурации, используя yaml.dump ():

with open(path_to_config, 'w', encoding='utf-8') as config:
    yaml.dump(data, config)

, который выглядит так при открытии в текстовом редакторе:

destination:
  root_path: C:/Users/Name/Desktop/ü

При печати жестко запрограммированного значения на консоль отображается:

C:/Users/Name/Desktop/▒

или при использовании print(root_path.encode('utf-8')):

b'C:/Users/Name/Desktop/\xc3\xbc.

Для извлечения root_pathиз файла конфигурации, который я использую:

with open('config.yaml') as cfg:
    user_data = yaml.load(cfg)
    root_path = user_data['destination']['root_path']

Когда я печатаю путь root_path, полученный из файла config.yml, вместо этого я получаю:

C:/Users/Name/Desktop/ü

и с использованием print(root_path.encode('utf-8')):

b'C:/Users/Name/Desktop/\xc3\x83\xc2\xbc'

Откуда эта разница и как я могу преобразовать значение, загруженное из файла конфигурации, чтобы os.path.isdir () мог найти файл?

1 Ответ

0 голосов
/ 19 января 2019

В большинстве примеров вы увидите, что чтение файла YAML с диска осуществляется с помощью:

yaml = ruamel.yaml.YAML()
with open('config.yaml') as fp:
    yaml.load(fp)

Это открытие - открытие для чтения (аналогично open("config.yaml", "r")).Это хорошо в Linux или в Windows при использовании ASCII / текстовых файлов.Но для того, чтобы синтаксический анализатор YAML правильно обрабатывал ввод не-ASCII в Windows, вы должны открыть файл в режиме чтения в двоичном формате:

yaml = ruamel.yaml.YAML()
with open('config.yaml', 'rb') as fp:
    yaml.load(fp)
...