2017-11-28 43 views
1

일부 문자열을 값 필드로 갖는 YAML에 파이썬 사전을 덤프하려고합니다. 내가 할YAML에 큰 따옴표와 공백이있는 값을 인쇄하는 방법은 무엇입니까?

import yaml 
str1 = "hello" 
str2 = "world" 
mystr = "\"" + str1 + str(" ") + str2 + "\"" 
mydict = {"a" : mystr} 
f = open("temp.yaml", "w") 
yaml.dump(mydict, f, default_flow_style = False, \ 
        explicit_start = "---", explicit_end = "...", encoding = 'UTF-8') 
f.close() 

YAML은 다음과 같습니다

a: '"hello 
world"' 

공지 사항, 값은 "안녕하세요 세계는"다음 행으로 유출된다. 파이썬 3.5 및 YAML 모듈 버전 3.11을 사용하고 있습니다.

아래 예와 같이 YAML 모양을 만드는 방법을 알려 줄 수 있습니까?

a: "hello world" 
+0

1. 'mystr'대신 'mydict'를 덤프하려고합니다. 2. python 3.5.3과 pyyaml ​​3.12로'{hellow world ''}'를 얻고 있습니다. 사용중인 실제 코드를 보여주고 있습니까? – tinita

+0

3. 큰 따옴표를 사용하여 값을 출력하려면 PyYAML (미안, 현재 옵션이 있는지 몰라)을 말해야합니다. 내 출력'{a : ' "hello world"'}' – tinita

+0

@tinita에서 볼 수 있듯이 덤핑하기 전에 문자열에 doublequotes를 추가하면 원하는 효과를 얻을 수 없습니다 : 예 'mystict'가 아니라 'mydict'를 덤핑합니다. 위의 그것을 편집해라. .. 나는 이중 인용문 앞에서 작은 따옴표를 볼 수 있었다. .. – pranav3688

답변

2

코드가 약간 엉망이지만 원하는 결과를 얻을 수 있습니다.

global dict_keys 

def mk_double_quote(dumper, data): 
    if data in dict_keys: 
     return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='') 
    else: 
     return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') 

yaml.add_representer(str, mk_double_quote) 

d = {'a': 'Hello World'} 
dict_keys = set(d.keys()) 

f = open('temp.yaml', 'w') 
yaml.dump(d, f, default_flow_style=False, encoding='utf-8') 
f.close() 

결과는 다음과 같이 표시됩니다 당신은 문자열을 두 번 (또는 단일) 따옴표를 얻을 수있는을 통해 미세 입자 제어하려면 a: "Hello World"

1

, 사용한다 ruamel.yaml (면책 조항 : 그 패키지의 저자) . 이것은 PyYAML의 개선 된 버전입니다. PyYAML의 많은 오랜 문제점이 수정되었습니다. 그와

당신은 할 수 있습니다 :

import sys 
import ruamel.yaml 

mystr = ruamel.yaml.scalarstring.DoubleQuotedScalarString('hello world') 
mydict = dict(a=mystr) 

yaml = ruamel.yaml.YAML() 
yaml.dump(mydict, sys.stdout) 

이 얻을 : 당신은 YAML 문서로 시작하는 경우

a: "hello world" 

는 상황이 더 쉽게, 당신은 당신이를 보존하려면 표시 할 수 있습니다 불필요한 따옴표 :

yaml_str = """\ 
a: "hello world" 
""" 

yaml = ruamel.yaml.YAML() 
yaml.preserve_quotes = True 
data = yaml.load(yaml_str) 
yaml.dump(data, sys.stdout)