【问题标题】:How to pre-process a yaml file in python 3.4?如何在 python 3.4 中预处理 yaml 文件?
【发布时间】:2015-06-02 15:18:13
【问题描述】:

背景是我有数百个 Yaml 文件,它们是系统的配置文件。我想对它们进行整体分析,寻找配置中的问题。

所以我需要像this question 那样对每个文件进行预处理,以在对它们进行一些处理之前删除一些非法字符。但是我是一个 python 新手,不能使用建议的生成器解决方案。如果可能,不应修改真实文件。我正在使用 python 3.4。

我的主要问题是迭代器函数没有被调用,这让我觉得我没有正确访问迭代器行为。

本质上我有一个文件处理功能,可以处理目录中的所有文件,如下所示:

with open(os.path.join(myDir, fileName), 'r') as inputFile:
    print("about to call replace_iter")
    iterable = replace_iter(inputFile, "push", "force")
    print("about to call yaml.safe_load()")
    dataMap = yaml.safe_load(iterable)
    print("about to process my data map")
    type = dataMap['type']
    # process the dataMap ites ...
    print("done")

我在文件顶部定义了一个函数,如下所示

def replace_iter(iterable, search, replace):
    print("replace_iter called")
    for value in iterable:
        yield value.replace(search, replace)

这给出了这样的输出,跳过了对生成器函数的调用,因此表明我没有正确访问迭代器功能。

about to call replace_iter
about to call yaml.safe_load()

【问题讨论】:

  • value.replace 不修改value,它返回一个新对象,然后你可以yield
  • 请不要以这种方式连接目录和文件。此外,file 是一个内置函数,您不应该将其用作变量名。而是:with open(os.path.join(myDir, fileName)) as input_file:
  • 代码是否到达yaml.safe_load(iterable)?之前的那条线呢?
  • 我已更新代码以反映 Hai 提出的改进建议。
  • @PeterWood 正如你从我的更新中看到的那样,它到达了 yaml.safe_load() 但它实际上并没有调用 replace_iter 函数,否则我们会看到它的调试打印行。

标签: python python-3.x stream generator


【解决方案1】:

str.replace 不修改字符串,而是返回修改后的值:

str.replace(old, new[, count])
返回字符串的副本,其中所有出现的子字符串 old 都替换为 new。如果给定了可选参数 count,则仅替换第一个 count 出现。

您需要生成返回值。

def replace_iter(iterable, search, replace):
    for value in iterable:
        yield value.replace(search, replace)

【讨论】:

  • 感谢您的提示。不过,我认为我还没有解决这个问题。在我看来,replace_iter 函数没有被调用,因为如果我在其中放置一些调试打印语句,我什么也得不到。
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 2015-02-10
  • 2015-07-31
  • 2017-07-15
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 2018-07-14
相关资源
最近更新 更多