我有这个代码
python_data_struct = {
'amazon_app_id': amazon_app_id,
'librivox_rest_url': librivox_rest_url,
'librivox_id': librivox_id,
'top': top,
'pacakge': 'junk',
'version': 'junk',
'password': password,
'description': description,
'long_description': long_description,
'make_audiobook::sftp_script::appname': '"%{::appname}"'
}
try:
myyaml = yaml.dump(python_data_struct)
except:
e = sys.exc_info()[0]
print "Error on %s Error [%s]" % ( librivox_rest_url, e )
sys.exit(5)
write_file( myyaml, hiera_dir + '/' + appname + '.yaml' );
它输出如下所示的 yaml:
{amazon_app_id: junk, description: !!python/unicode ' Riley was an American writer
known as the "Hoosier poet", and made a start writing newspaper verse in Hoosier
dialect for the Indianapolis Journal in 1875. His favorite authors were Burns
and Dickens. This collection of poems is a romanticized and mostly boy-centered
paean to a 19th century rural American working-class childhood. (Summary by Val
Grimm)', librivox_id: '1000', librivox_rest_url: 'https://librivox.org/api/feed/audiobooks/id/1000/extended/1/format/json',
long_description: !!python/unicode "n Riley was an American writer known as the
"Hoosier poet", and made a start writing newspaper verse in Hoosier dialect
for the Indianapolis Journal in 1875. His favorite authors were Burns and Dickens.
This collection of poems is a romanticized and mostly boy-centered paean to
a 19th century rural American working-class childhood. (Summary by Val Grimm)n
nThe "Selected Riley Child-Rhymes" App will not use up your data plan's minutes
by downloading the audio files (mp3) over and over. You will download load all
the data when you install the App. The "Selected Riley Child-Rhymes" App works
even in airplane mode and in places without Wi-Fi or phone network access! So
you can listen to your audio book anywhere anytime! The "Selected Riley Child-Rhymes"
App automatically pauses when you make or receive a phone call and automatically
resumes after the call ends. The "Selected Riley Child-Rhymes" App will continue
to play until you exit the App or pause the reading so it is perfect for listening
in bed, at the gym, or while driving into work." n", 'make_audiobook::sftp_script::appname': '"%{::appname}"',
pacakge: junk, password: junk, top: junk, version: junk}
很难看到,但有问题的特定键/值对是这样的:
'make_audiobook::sftp_script::appname': '"%{::appname}"',
我需要它是这样的:
'make_audiobook::sftp_script::appname': "%{::appname}",
只需在%{::appname}
周围加上双引号,我就不知道在我的 python 代码中该做什么。 请帮助:)
想要一个YAML中的字符串,那么你只需要一个Python中的字符串:
python_data_struct = {
'make_audiobook::sftp_script::appname': '%{::appname}'
}
print yaml.dump(python_data_struct)
这为您提供:
{'make_audiobook::sftp_script::appname': '%{::appname}'}
或者等效地,default_flow_style=False
make_audiobook::sftp_script::appname: '%{::appname}'
在 YAML 中,使用双引号的"a value"
和使用单引号的'a value'
之间没有区别。 这:
my_key: 'my value'
而这个:
my_key: "my value"
将两者都评估为完全相同的数据结构。
如果您需要控制 Python YAML 转储中的引号,我建议使用 ruamel.yaml
(免责声明:我是该包的作者(
import sys
from ruamel import yaml
amazon_app_id = 'junk'
librivox_rest_url = 'https://librivox.org/api/feed/audiobooks/id/1000/extended/1/format/json'
python_data_struct = {
'amazon_app_id': amazon_app_id,
'librivox_rest_url': librivox_rest_url,
'pacakge': 'junk',
'version': 'junk',
yaml.scalarstring.SingleQuotedScalarString('make_audiobook::sftp_script::appname'):
yaml.scalarstring.DoubleQuotedScalarString('%{::appname}')
}
try:
with open(hiera_dir + '/' + appname + '.yaml') as fp:
yaml.round_trip_dump(python_data_struct, fp)
except Exception as e:
print("Error on {} Error [{}]".format(librivox_rest_url, e))
sys.exit(5)
这为您提供:
librivox_rest_url: https://librivox.org/api/feed/audiobooks/id/1000/extended/1/format/json
version: junk
'make_audiobook::sftp_script::appname': "%{::appname}"
amazon_app_id: junk
pacakge: junk
请注意,默认情况下,PyYAML 会在嵌入":"的标量周围加上引号,即使该字符后不跟空格,尽管这不是必需的。
也不是使用第二个参数来round_trip_dump()
,(dump()
也有这个参数(。不提供该参数并让 YAML 文件首先在内存中构建效率非常低。
我还更改了您的其他一些代码,除非您坚持使用 Python 2.6 左右,否则您应该 IMO 使您的语法现代化。您可能还想查看键名(您的真正意思是"pacakge
"吗?