这个较短的yaml输出是否安全

时间:2013-05-25 07:32:56

标签: python yaml

我将经常使用yaml来序列化不同数据类型的单个值。我注意到PyYAML经常会在输出结尾添加字符串'\n''\n...\n'。在我有限的实验中,删除这些尾随字符似乎是安全的。

默认行为

import yaml, decimal, datetime
items = ['hello', 3, True, decimal.Decimal('3.2'), datetime.date(2013, 5, 25)]
for i in items:
    data = yaml.dump(i)
    print '%r %r %r' % (i == yaml.load(data), i, data)

将输出:

True 'hello' 'hello\n...\n'
True 3 '3\n...\n'
True True 'true\n...\n'
True Decimal('3.2') "!!python/object/apply:decimal.Decimal ['3.2']\n"
True datetime.date(2013, 5, 25) '2013-05-25\n...\n'

删除特殊尾随字符

import yaml, decimal, datetime
items = ['hello', 3, True, decimal.Decimal('3.2'), datetime.date(2013, 5, 25)]
for i in items:
    data = yaml.dump(i).replace('\n...\n', '').rstrip('\n')
    print '%r %r %r' % (i == yaml.load(data), i, data)

将输出:

True 'hello' 'hello'
True 3 '3'
True True 'true'
True Decimal('3.2') "!!python/object/apply:decimal.Decimal ['3.2']"
True datetime.date(2013, 5, 25) '2013-05-25'

第二块代码是安全的。它是否适用于所有输入数据。我正在寻找会破坏的情况。我对任何会破坏的情况感兴趣,即使是复杂的嵌套输入数据。

1 个答案:

答案 0 :(得分:1)

trailing elipsis可选地表示文档的结尾,这使YAML自我分隔。这在将多个YAML文档嵌入到同一个流中时非常有用,但如果您不需要它,则可以安全地将其删除。

尾随换行也是可选的,但传统的文本解析工具会期望每一行以换行符结束。换句话说,传统的Unix文本处理不会将换行视为行之间的分隔符,而是作为当前行的终结符。未终止的最终行是一个单独处理的异常(diff的“文件末尾没有换行”消息),并且通常是错误的来源。你可以删除最后的换行符,但我会建议你不要这么做。