Estoy tratando de leer el siguiente archivo YAML en 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"

Usando este código simple:

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

Pero el resultado que obtuve es el siguiente:

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

Como puede ver, todos los acentos y caracteres especiales como "ñ" están en mal estado. ¿Alguna idea de por qué y cómo solucionarlo?

Estoy usando Python 3.7

0
jcf 11 oct. 2019 a las 14:38

3 respuestas

La mejor respuesta

Deberías leerlo como UTF-8.

with open('file.yaml', 'rt', encoding='utf8') as file:   
     countries = yaml.load(file)
3
Florian Bernard 11 oct. 2019 a las 11:54

Puede probar 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]))

Salida:

Espana
Peru
Mexico
South Africa
0
mulaixi 11 oct. 2019 a las 11:49

Estás haciendo tu vida más complicada de lo necesario al usar PyYAML. Contrariamente a las afirmaciones de que FullLoader " Carga la totalidad Ñame idioma ", solo analiza YAML 1.1 (obsoleto hace diez años) y no funciona completamente cárgalo. Y tiene que ocuparse de demasiados detalles de no ASCII manejo.

En ruamel.yaml (descargo de responsabilidad: soy el autor de ese paquete), puede simplemente hacer

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)

Que da:

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

Por lo tanto, no tiene que abrir la instancia Path, ni recordar hacerlo de una manera especial (También puede entregar dicha instancia a yaml.dump())

0
Anthon 13 oct. 2019 a las 08:56
58340498