Python YAML hiera 以及如何将值放在双引号内?
Python YAML hiera and how have value be inside double quotes?
我有这个代码
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}
这很难看出,但有问题的特定 key/value 对是这一对:
'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 默认情况下会在嵌入了“:”的标量周围加上引号,即使该字符后面没有跟 space,尽管这不是必需的。
也没有使用第二个参数给round_trip_dump()
,(dump()
也有这个参数)。不提供该参数并让 YAML 文件先在内存中构建是非常低效的。
我还更改了您的一些其他代码,除非您卡在 Python 2.6 左右,否则您应该 IMO 使您的语法现代化。您可能还想查看键名(您的意思是“pacakge
”吗?)
我有这个代码
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}
这很难看出,但有问题的特定 key/value 对是这一对:
'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 默认情况下会在嵌入了“:”的标量周围加上引号,即使该字符后面没有跟 space,尽管这不是必需的。
也没有使用第二个参数给round_trip_dump()
,(dump()
也有这个参数)。不提供该参数并让 YAML 文件先在内存中构建是非常低效的。
我还更改了您的一些其他代码,除非您卡在 Python 2.6 左右,否则您应该 IMO 使您的语法现代化。您可能还想查看键名(您的意思是“pacakge
”吗?)