使用pyyaml读取目录中的多个文件

时间:2019-06-15 16:20:42

标签: python-2.7 pyyaml

我正在尝试读取目录中的所有Yaml文件,但遇到了麻烦。首先,因为我使用的是Python 2.7(并且不能更改为3),并且我的所有文件都是utf-8(并且我还需要它们保持这种方式)。

visit()

当我运行这段代码时,python给我消息:

// Wait 30 seconds for page 'load' event
cy.visit('/YOUR_PAGE', { timeout: 30000 })

我希望该程序显示文件的内容。谁能帮我吗?

2 个答案:

答案 0 :(得分:0)

我猜问题出在文件路径上。 os.listdir(os.getcwd())返回目录中所有文件的列表。所以您将列表传递给codecs.open()而不是文件名

答案 1 :(得分:0)

除了格式化它的无效代码外,您的代码还有很多问题。

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,并保留注释等内容。

即使您必须使用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'))