【问题标题】:Replace certain characters in stream替换流中的某些字符
【发布时间】:2013-01-18 14:31:04
【问题描述】:

我有一个将输入流作为输入的方法(.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)

【问题讨论】:

    标签: python stream


    【解决方案1】:

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

    鉴于此,它变得有点尴尬。您可以编写自己的包装器,以类似文件的方式(其基础可能是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()。您所说的“流”实际上只是字符串(文件的行)的迭代器。

    【讨论】:

    • 啊,好吧。我想我对流的理解低于标准。感谢您的快速回复和 +1 with
    • 以下示例因 AttributeError 失败:'generator' object has no attribute 'read'
    猜你喜欢
    • 2020-12-12
    • 2012-02-17
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    相关资源
    最近更新 更多