我试图用Python解析文本流。正在逐行检查内容,并在匹配时将给定的行传递给函数进行处理。
处理正在进行,函数返回预期结果。但是,我无法使用新行更新原始流 - 目的是将匹配的行替换为' text'函数返回的值。
我使用的代码如下:
import StringIO
for line in StringIO.StringIO(data):
if line.startswith('MATCHTHIS'):
meta, text = parse_data(line)
在此之前一切正常 - 也就是说,'元'和'文字'包含我期望的值。但我无法更新“数据”中的具体行。反映&text;'
的价值。 line.replace(line, text)
在if
区块内有效,但更改并未将其恢复为“数据”。
答案 0 :(得分:1)
字符串是Python中的不可变对象,您无法更改其值。如果要更改StringIO
缓冲区内的值,可以像使用seek
和write
的任何其他文件一样进行更改,但替换不同长度的行将是一个问题。< / p>
我建议将文本流建模为行列表。例如:
text = "line 1\nMATCHTHIS line 2\nline 3"
lines = text.split('\n')
for i, line in enumerate(lines):
if line.startswith("MATCHTHIS"):
meta, new_line = parse_data(line)
lines[i] = new_line # Replace old line.
new_text = '\n'.join(lines) # Recreate text with replaced lines.
此外,像sed
和管道这样的经典控制台工具也非常适合这项工作。