您的代码存在多个问题,除了它是无效的 Python,在您格式化此的方式上。
def yaml_reader(filepath):
with codecs.open(filepath, "r", encoding='utf-8') as file_descriptor:
data = yaml.load_all(file_descriptor)
return data
不过不需要解码,PyYAML 完全可以处理 UTF-8:
def yaml_reader(filepath):
with open(filepath, "rb") as file_descriptor:
data = yaml.load_all(file_descriptor)
return data
我希望您意识到您尝试加载多个文档并始终在data 中获得一个列表,即使您的文件包含一个文档。
然后一行:
filepath = os.listdir(os.getcwd())
给你一个文件列表,所以你需要这样做:
filepath = os.listdir(os.getcwd())[0]
或以其他方式决定要打开哪些文件。如果您想将所有文件(假设它们是 YAML)合并到一个大 YAML 文件中,您需要这样做:
if __name__ == "__main__":
data = []
for filepath in os.listdir(os.getcwd()):
data.extend(yaml_reader(filepath))
print data
您的转储程序需要更改为:
def yaml_dump(filepath, data):
with open(filepath, 'wb') as file_descriptor:
yaml.dump(data, file_descriptor, allow_unicode=True, encoding='utf-8')
然而,这一切都给你带来了最大的问题:你正在使用 PyYAML,它会破坏你的 YAML,删除流样式、注释、锚名称、特殊的 int/float、标量周围的引号等。除此之外,PyYAML 还有未更新以支持 YAML 1.2 文档(自 2009 年以来一直是标准)。我建议您改用 ruamel.yaml(免责声明:我是该软件包的作者),它支持 YAML 1.2 并保留 cmets 等。
即使你一定要使用 Python 2,你也应该使用类似 Python 3 的语法,例如print 可以通过 from __future__ 导入获得。
所以我建议你这样做:
pip install pathlib2 ruamel.yaml
然后使用:
from __future__ import absolute_import, unicode_literals, print_function
from pathlib import Path
from ruamel.yaml import YAML
if __name__ == "__main__":
data = []
yaml = YAML()
yaml.preserve_quotes = True
for filepath in Path('.').glob('*.yaml'):
data.extend(yaml.load_all(filepath))
print(data)
yaml.dump(data, Path('your_output.yaml'))