pyyaml ​​y usando comillas solo para cadenas

Tengo el siguiente archivo YAML:

--- my_vars: my_env: "dev" my_count: 3 

Cuando lo leo con PyYAML y lo vuelvo a descargar, obtengo el siguiente resultado:

 --- my_vars: my_env: dev my_count: 3 

El código en cuestión:

 with open(env_file) as f: env_dict = yaml.load(f) print(yaml.dump(env_dict, indent=4, default_flow_style=False, explicit_start=True)) 

Intenté usar el parámetro default_style :

 with open(env_file) as f: env_dict = yaml.load(f) print(yaml.dump(env_dict, indent=4, default_flow_style=False, explicit_start=True, default_style='"')) 

Pero ahora me sale:

 --- "my_vars": "my_env": "dev" "my_count": !!int "3" 

¿Qué debo hacer para mantener el formato original, sin hacer suposiciones sobre los nombres de las variables en el archivo YAML?

Le sugiero que actualice a usar YAML 1.2 (lanzado en 2009) con el paquete ruamel.yaml compatible con versiones anteriores en lugar de usar PyYAML, que implementa la mayor parte de YAML 1.1 (2005). (Descargo de responsabilidad: Soy el autor de ese paquete).

Luego simplemente especifique preserve_quotes=True cuando se cargue para redondear el archivo YAML:

 import sys import ruamel.yaml yaml_str = """\ --- my_vars: my_env: "dev" # keep "dev" quoted my_count: 3 """ data = ruamel.yaml.round_trip_load(yaml_str, preserve_quotes=True) ruamel.yaml.round_trip_dump(data, sys.stdout, explicit_start=True) 

Qué salidas (incluido el comentario conservado):

 --- my_vars: my_env: "dev" # keep "dev" quoted my_count: 3 

Después de cargar la cadena, los escaladores serán una subclase de cadena, para poder acomodar la información de cotización, pero funcionarán como una cadena normal para todos los demás propósitos. Si desea reemplazar una cadena de este tipo ( dev a fgw ), debe convertir la cadena en esta subclase ( DoubleQuotedScalarString from ruamel.yaml.scalarstring ).

Cuando se redondea el disparo ruamel.yaml por defecto conserva el orden (por inserción) de las claves.

Correcto, por lo que pedir prestado en gran medida de esta respuesta , puedes hacer algo como esto:

 import yaml # define a custom representer for strings def quoted_presenter(dumper, data): return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') yaml.add_representer(str, quoted_presenter) env_file = 'input.txt' with open(env_file) as f: env_dict = yaml.load(f) print yaml.dump(env_dict, default_flow_style=False) 

Sin embargo, esto solo lo sobrecarga en todos los tipos de cadenas en el diccionario, así que también citará las claves, no solo los valores.

Se imprime:

 "my_vars": "my_count": 3 "my_env": "dev" 

¿Es esto lo que quieres? No está seguro de lo que quiere decir con nombres de variables, ¿se refiere a las teclas?