3

我有一个将输入流作为输入的方法(一个 .yml 解析器)。问题是它在某些地方遇到某些字符时会引发错误,例如%.

我想做的是获取流,用%占位符替换所有的,然后将其传递给解析器。

这就是我所拥有的(不适用于当前输入):

    stream = open('file.yml', 'r')
    dict = yaml.safe_load(stream)

但我认为我需要的是:

    stream = open('file.yml', 'r')
    temp_string = stringFromString(stream)     #convert stream to string
    temp_string.replace('%', '_PLACEHOLDER_')  #replace with place holder
    stream = streamFromString(temp_String)     #conver back to stream
    dict = yaml.safe_load(stream)
4

1 回答 1

6

编辑:显然这里的原始答案似乎不再起作用,并且该库现在需要一个类似文件的对象。

鉴于此,它变得有点尴尬。您可以编写自己的包装器,以类似文件的方式运行(其基础可能是io.TextIOBase)并在缓冲区中进行替换,但如果您愿意牺牲惰性,最简单的解决方案大致是最初建议的问题:在内存中进行替换。

将字符串转换为类似文件的对象的解决方案是io.StringIO.


老答案:

这样做的一个好方法是编写一个生成器,这样它就可以保持惰性(不需要一次读取整个文件):

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

with open("file.yml", "r") as file:
    iterable = replace_iter(file, "%", "_PLACEHOLDER")
    dictionary = yaml.safe_load(iterable)

请注意使用with语句打开文件 - 这是在 Python 中打开文件的最佳方式,因为它确保文件正确关闭,即使发生异常也是如此。

另请注意,这dict是一个糟糕的变量名称,因为它会破坏内置dict()并阻止您使用它。

请注意,您的stringFromStream()功能本质上是file.read(),并且steamFromString()data.splitlines()。您所说的“流”实际上只是字符串(文件的行)的迭代器。

于 2013-01-18T14:34:31.353 回答