Чтение YAML-файла на Python с акцентами и специальными символами - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь прочитать следующий файл YAML в Python:

countries:
  IT:
    "Italia"
  PT:
    "Portugal"
  ES:
    "España"
  PE:
    "Perú"
  FR:
    "France"
  MX:
    "México"
  BR:
    "Brasil"
  CO:
    "Colombia"
  CL:
    "Chile"
  ZA:
    "South Africa"

Используя этот простой код:

import yaml
with open('file.yaml') as file:
    countries = yaml.load(file, Loader='yaml.FullLoader')
print(countries)

Но полученный результат выглядит следующим образом:

{'countries': {'IT': 'Italia', 'PT': 'Portugal', 'ES': 'España', 'PE': 'Perú', 'FR': 'France', 'MX': 'México', 'BR': 'Brasil', 'CO': 'Colombia', 'CL': 'Chile', 'ZA': 'South Africa'}}

Как видите, все акценты и специальные символы, такие как «ñ», перепутаны. Любая идея, почему и как это исправить?

Я использую Python 3.7

Ответы [ 3 ]

3 голосов
/ 11 октября 2019

Вы должны прочитать это как UTF-8.

with open('file.yaml', 'rt', encoding='utf8') as file:   
     countries = yaml.load(file)
0 голосов
/ 13 октября 2019

С помощью PyYAML вы делаете свою жизнь более сложной, чем необходимо. Вопреки утверждениям, что FullLoader «Загружает полный язык YAML» , он анализирует только YAML 1.1 (устаревший десять лет назад) и не загружает его полностью. И вы должны позаботиться о слишком многих деталях обработки без ASCII.

В ruamel.yaml (заявление об отказе: я являюсь автором этого пакета), вы можете просто сделать

import sys
from pathlib import Path
import ruamel.yaml

yaml_file = Path('file.yaml')

yaml = ruamel.yaml.YAML(typ='safe')

countries = yaml.load(yaml_file)
print(countries)

, что дает:

{'countries': {'IT': 'Italia', 'PT': 'Portugal', 'ES': 'España', 'PE': 'Perú', 'FR': 'France', 'MX': 'México', 'BR': 'Brasil', 'CO': 'Colombia', 'CL': 'Chile', 'ZA': 'South Africa'}}

Так что вам не нужно открывать экземпляр Path и не забывать делать это особым образом. (Вы также можете передать такой экземпляр yaml.dump())

0 голосов
/ 11 октября 2019

Вы можете попробовать gensim.utils.deaccent

from gensim.utils import deaccent

mydict={'countries': {'ES': 'España', 'PE': 'Perú', 'MX': 'México', 'ZA': 'South Africa'}}

for key, value in mydict.items():
    for k,v in value.items():
        print(deaccent(value[k]))

Вывод:

Espana
Peru
Mexico
South Africa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...