Python:来自stdin的多个文本处理
我想编写一个python脚本,它将集成到shell管道中。因此,它必须从std输入中获取一些输入文本,并将结果打印到std输出。我有多个文本处理链接。一些处理应用于每一行,其他处理在更改之前首先需要检测一些块Python:来自stdin的多个文本处理,python,Python,我想编写一个python脚本,它将集成到shell管道中。因此,它必须从std输入中获取一些输入文本,并将结果打印到std输出。我有多个文本处理链接。一些处理应用于每一行,其他处理在更改之前首先需要检测一些块 我为每个文本处理创建了一个循环,但我的问题是,我不知道如何将它们链接起来,使下一个循环将上一个循环的输出作为输入 下面是我的初稿。 由于我习惯于编写shell脚本,我有一种感觉,我将不得不使用tempfiles,但我不确定这是Python的方式。 我假设如果我把每个循环的处理也放在一个函数
我为每个文本处理创建了一个循环,但我的问题是,我不知道如何将它们链接起来,使下一个循环将上一个循环的输出作为输入 下面是我的初稿。 由于我习惯于编写shell脚本,我有一种感觉,我将不得不使用tempfiles,但我不确定这是Python的方式。 我假设如果我把每个循环的处理也放在一个函数中会更好
#/usr/bin/python3
“”“预处理格式化脚本示例”“”
导入文件输入
进口稀土
导入系统
“读取标准数据”
lines\u in=fileinput.input()
lines_out=“”
preform_txt_regex=re.compile(r“^”)
code_block=“”
"""
浏览输入并替换“预格式化文本”(从2个空格开始)
进入“固定宽度文本”(…
)。
"""
对于行中的行,请参见:
如果第.startswith(“”)行:
代码块=代码块+预成型文本正则表达式sub(“”,第行)
其他:
如果代码块!="":
lines\u out=lines\u out+“\n{}\n”。格式(代码块)
code_block=“”
系统标准输出写入(行)
lines\u out=lines\u out+line
#重置线路输入和线路输出
lines\u in=lines\u out.split(“\n”)
lines_out=“”
"""
删除所有“类别”标签
"""
对于行中的行,请参见:
lines\u out=lines\u out+re.sub(r'\[\[Cat[e]gor.*:[^\]]*]',r'',行)
"""
很少有其他字符串替换
"""
对于行中的行,请参见:
[...]
“”“打印处理过的文本”“”
系统标准输出写入(输出行)
来自@Steve和@ibra的建议是使用行列表作为变量缓冲区。事实上,我做了这样的事情
下面是我的代码。我在函数中移动了我的处理循环,这些函数将行\u buffer
作为参数:
#/usr/bin/python3
#-*-编码:utf-8-*-
“”“预处理格式化脚本示例”“”
导入文件输入
进口稀土
导入系统
"""
浏览输入并替换“预格式化文本”(从2个空格开始)
进入“固定宽度文本”(…
)。
"""
def渲染代码块(行):
preform_txt_regex=re.compile(r“^”)
代码块=[]
输出=[]
对于行中的行:
如果第.startswith(“”)行:
代码块追加(预成型文本正则表达式sub(“”,行))
其他:
如果代码块!=[]:
output.append(“\n{}\n”.format(代码块))
代码块=[]
output.append(行)
返回输出
"""
删除所有“类别”标签
"""
def移除_类别_标签(行):
输出=[]
对于行中的行:
output.append(re.sub(r'\[\[Cat[e]gor.*:[^\]*]]',r'',第行))
返回输出
“主要”
行\u缓冲区=[]
lines\u buffer=fileinput.input()
lines\u buffer=渲染代码块(lines\u buffer)
lines\u buffer=删除\u类别\u标记(lines\u buffer)
对于缓冲区中的行:
系统标准输出写入(行)
当然,我必须用列表初始化(
=[]
)和附加(+
)代替串接(+
)来替换字符串初始化(=”
)。以使下一个循环将上一个循环的输出作为输入!!!,你为什么不把结果保存在临时变量中,然后使用它,不打印输出,然后再读一遍呢?你的基本想法看起来不错正如@ibra所说,在最后一刻之前,你可能不想输出任何东西。-接下来,在每次处理完每一行之后,您应该考虑一下要对每一行执行什么操作。您可以使用buffer=[]
创建一个列表,并以一种可以将处理每行的结果放回同一buffer
对象的方式遍历该列表。实际上,将行列表作为缓冲区似乎是一种可行的方法。谢谢@ibra和@Steve!