在Python文本流中搜索和替换行

时间:2015-08-06 01:18:31

标签: python-2.7 stream

我试图用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区块内有效,但更改并未将其恢复为“数据”。

1 个答案:

答案 0 :(得分:1)

字符串是Python中的不可变对象,您无法更改其值。如果要更改StringIO缓冲区内的值,可以像使用seekwrite的任何其他文件一样进行更改,但替换不同长度的行将是一个问题。< / 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和管道这样的经典控制台工具也非常适合这项工作。