Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:来自stdin的多个文本处理_Python - Fatal编程技术网

Python:来自stdin的多个文本处理

Python:来自stdin的多个文本处理,python,Python,我想编写一个python脚本,它将集成到shell管道中。因此,它必须从std输入中获取一些输入文本,并将结果打印到std输出。我有多个文本处理链接。一些处理应用于每一行,其他处理在更改之前首先需要检测一些块 我为每个文本处理创建了一个循环,但我的问题是,我不知道如何将它们链接起来,使下一个循环将上一个循环的输出作为输入 下面是我的初稿。 由于我习惯于编写shell脚本,我有一种感觉,我将不得不使用tempfiles,但我不确定这是Python的方式。 我假设如果我把每个循环的处理也放在一个函数

我想编写一个python脚本,它将集成到shell管道中。因此,它必须从std输入中获取一些输入文本,并将结果打印到std输出。我有多个文本处理链接。一些处理应用于每一行,其他处理在更改之前首先需要检测一些块


我为每个文本处理创建了一个循环,但我的问题是,我不知道如何将它们链接起来,使下一个循环将上一个循环的输出作为输入

下面是我的初稿。 由于我习惯于编写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!