Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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
Python 停止PyYaml将yaml项转换为列表_Python_Yaml_Pyyaml - Fatal编程技术网

Python 停止PyYaml将yaml项转换为列表

Python 停止PyYaml将yaml项转换为列表,python,yaml,pyyaml,Python,Yaml,Pyyaml,我正在尝试加载以下yaml: yaml_string=”“” 关键: -[你好] -另一串 -另一个 """ yaml.safe_load(yaml_字符串)#返回{“key”:[[“HELLLO”],“另一个_字符串”,“另一个”} 结果是包含HELLO字符串的列表 type(yaml.save\u load(yaml\u string.get(“key”)[0]) 由于yaml描述了某种以这种方式格式化的COMMNAD,因此有必要将其作为字符串而不是序列来读取。基本上,我希望能够读取以括

我正在尝试加载以下yaml:

yaml_string=”“”
关键:
-[你好]
-另一串
-另一个
"""
yaml.safe_load(yaml_字符串)#返回{“key”:[[“HELLLO”],“另一个_字符串”,“另一个”}
结果是包含HELLO字符串的列表

type(yaml.save\u load(yaml\u string.get(“key”)[0])
由于yaml描述了某种以这种方式格式化的COMMNAD,因此有必要将其作为字符串而不是序列来读取。基本上,我希望能够读取以括号开头和结尾的字符串。正如下面的注释所述,不幸的是,无法添加
因为yaml文件是由使用Jackson的Java应用程序创建的,Jackson将yaml转换为对象并将以括号开头和结尾的条目视为字符串没有问题。对于许多用户来说,这些文件都可以开始添加引号

这可能吗


编辑:添加了一个更完整的示例,带有引号:

import yaml

yaml_string = """
key:
- "[HELLO]"
- another string
- another
"""

print(yaml.safe_load(yaml_string))
输出

{'key': ['[HELLO]', 'another string', 'another']}

如果需要字符串
“HELLO”
,请在YAML中删除其周围的
[…]

yaml_string = """
key:
- HELLO
"""
print(yaml.safe_load(yaml_string))
# {'key': ['HELLO']}
yaml_string = """
key:
- "[HELLO]"
"""
print(yaml.safe_load(yaml_string))
# {'key': ['[HELLO]']}

如果需要字符串
“[HELLO]”
(而不是包含字符串
“HELLO”
)的列表,请在YAML中添加引号:

yaml_string = """
key:
- HELLO
"""
print(yaml.safe_load(yaml_string))
# {'key': ['HELLO']}
yaml_string = """
key:
- "[HELLO]"
"""
print(yaml.safe_load(yaml_string))
# {'key': ['[HELLO]']}

[]
语法是YAML语法的一部分。如果您使用程序创建此语法,并且这些语法应该是字符串,则您使用的程序无法正确实现YAML,因为必须引用字符串

您可以尝试使用下面的实验性perl脚本在
[…]
周围添加引号。这取决于您的文档不使用应该是真实序列的流样式序列的假设。此外,它可能不适用于所有情况

如果字符串只有开头的
[
,而没有结尾的,那么它肯定不起作用

!/usr/bin/env perl
严格使用;
使用警告;
使用5.010;
使用YAML::LibYAML::API::XS;
my$yaml={start};
my$line=$start->{line};
my$column=$start->{column};
#在之前添加单引号[
substr($lines[$line],$column,0)=“'”;
#查找下一个匹配的“]`
while(my$event=shift@events){
如果($event->{name}eq'sequence\u end\u event'){
my$end=$event->{end};
my$line=$end->{line};
#在后面添加单引号]
#添加1,因为我们已经修改了行并添加了一个字符
my$column=$end->{column}+1;
substr($lines[$line],$column,0)=“'”;
最后的
}
}
}
}
$yaml=连接“”,@行;
比如说$yaml;
如果您有一个到libyamlapi的接口,那么就可以使用Python执行同样的操作

输出:

key:
- '[HELLO]'
- another string
- another
- '[HELLO2]'

如果你想要一个字符串,那么你为什么要使用
-
[…]
?这些使值成为一个列表。我编辑了我的问题。在yaml中,它是一个项目列表的键。我想要所有的字符串。你仍然没有解释为什么在
HELLO
周围添加
[…]
。所以,要清楚,不是
{“键”:[[“HELLLO”]、“other_string”、“other”}
您想要
{“key”:[“[HELLLO]”、“other_string”、“other”}
?不可能像字符串一样读取这些项(一般情况下)。
[…]
是官方YAML语法的一部分(如JSON中)。它被称为流样式(与默认的块样式相反)。您必须实现忽略流样式语法的解析器。基本上,如果您希望
[foo]
是字符串
“[foo]"
,您拥有的不是YAML。是的,这是不可能的,因为我的大多数YAML文件都是自动创建的,因为不包含引号,而且有太多的文件需要这样做。默认情况下,pyyaml有没有办法做到这一点。一般来说,我希望pyyaml跳过转换为列表布尔值等。我希望它们是纯字符串。我希望处理强制转换以另一种方式step@Apo您可以使用regex replace,no?@cricket_007,这可能非常脆弱,因为可能还有其他位置有
[
character@tinita那么?你可以与
-\s+\[[^]+\]
@cricket\u 007进行匹配当然,如果所讨论的“字符串”始终是序列项并且
-[…]
不会出现在其他任何地方。我不知道完整的YAML文件是什么样子。regex replace和我的解决方案各有优缺点