我有一个将输入流作为输入的方法(一个 .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)
请您参考如下方法:
编辑:显然这里的原始答案似乎不再有效,库现在需要一个类似文件的对象。
鉴于此,它变得有点尴尬。您可以编写自己的包装器,以类似文件的方式运行(其基础可能是 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。分割线()。您所谓的“流”实际上只是字符串(文件行)的迭代器。
