Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在yaml.dump Python中强制使用引号_Python_String_Yaml_Quotes - Fatal编程技术网

在yaml.dump Python中强制使用引号

在yaml.dump Python中强制使用引号,python,string,yaml,quotes,Python,String,Yaml,Quotes,在我进入之前,是的,我已经研究过了,并且知道YAML没有区分引号和非引号,只是将类型保持原样。坦率地说,我认为没有报价会更好,但不幸的是,这不是我需要的。因此,请尝试并理解我已经调查了此事,但仍然需要字符串对象周围的引号 在我的代码中,我有一本字典: data = {dic:[{A:''}, {B:''}, {C:''}, {D:''},...]} 'var*'是通过PyQt4QLineEdit类构造的,代码行提取行如下所示: var* = str(QtGui.QLineEdit().disp

在我进入之前,是的,我已经研究过了,并且知道YAML没有区分引号和非引号,只是将类型保持原样。坦率地说,我认为没有报价会更好,但不幸的是,这不是我需要的。因此,请尝试并理解我已经调查了此事,但仍然需要字符串对象周围的引号

在我的代码中,我有一本字典:

data = {dic:[{A:''}, {B:''}, {C:''}, {D:''},...]}
'var*'
是通过PyQt4
QLineEdit
类构造的,代码行提取行如下所示:

var* = str(QtGui.QLineEdit().displayText())
所以当我做
data['dic'][index]['A'-'Z']=var*

它变成
data={dic:[{A:'var1'},{B:'var2'},{C:'var3'},{D:'var4'},…]}

然后我转储所有数据:

prettyData = yaml.dump(data, default_flow_style=False, width=10000000)
print prettyData
我得到:

dic:
  - A: var1
  - B: var2
  - C: var3
  - D: var4
  ...
我尝试了很多方法让它们出现:

dic:
  - A: 'var1'
  - B: 'var2'
  - C: 'var3'
  - D: 'var4'
  ...
但是还没有成功。在这个问题上,我听到了各种不同的观点,从“不可能”到“只是引用它们”,你可以看到,在我的情况下,我不能这样做


有什么想法吗?

您可以为标量覆盖发射器,并动态更改发射值的样式。根据您拥有的其余标量值,您可能需要执行更多的测试来取消设置
is\u string
。当调用
process\u scalar
时,您不再知道原始值,只有一个带有(unicode)字符串值的事件

import sys
import ruamel.yaml as yaml

yaml_str = """\
dic:
  - A: var1    # need to get these strings quoted
  - B: var2
  - C: var3
  - D: var4
  - E: 3       # leave this alone
"""

# the scalar emitter from emitter.py
def process_scalar(self):
    if self.analysis is None:
        self.analysis = self.analyze_scalar(self.event.value)
    if self.style is None:
        self.style = self.choose_scalar_style()
    split = (not self.simple_key_context)
    # VVVVVVVVVVVVVVVVVVVV added
    if split:  # not a key
        is_string = True
        if self.event.value and self.event.value[0].isdigit():
            is_string = False
        # insert extra tests for scalars that should not be ?
        if is_string:
            self.style = "'"
    # ^^^^^^^^^^^^^^^^^^^^
    # if self.analysis.multiline and split    \
    #         and (not self.style or self.style in '\'\"'):
    #     self.write_indent()
    if self.style == '"':
        self.write_double_quoted(self.analysis.scalar, split)
    elif self.style == '\'':
        self.write_single_quoted(self.analysis.scalar, split)
    elif self.style == '>':
        self.write_folded(self.analysis.scalar)
    elif self.style == '|':
        self.write_literal(self.analysis.scalar)
    else:
        self.write_plain(self.analysis.scalar, split)
    self.analysis = None
    self.style = None
    if self.event.comment:
        self.write_post_comment(self.event)

data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
dd = yaml.RoundTripDumper
dd.process_scalar = process_scalar
yaml.dump(data, sys.stdout, Dumper=dd)
并将其作为输出项1获取:

dic:
- A: 'var1'    # need to get these strings quoted
- B: 'var2'
- C: 'var3'
- D: 'var4'
- E: 3         # leave this alone

这是我作为作者使用的。那个包裹是 Pyaml的增强。您可能可以对后者执行类似的操作,但它会删除输入中的注释

结果是:

$ python2 quoting_example.py
"key": "value"
"multiline": |-
  foo
  bar

类似地,您可以为unicode、dicts(想想排序的dicts)等添加representers。

您是否尝试过在字典中存储例如
repr(var1)
,而不是
var1
?是的,我有,奇怪的是,它给了var三个单引号:
“var1”
,这并不漂亮。。。
$ python2 quoting_example.py
"key": "value"
"multiline": |-
  foo
  bar