Python 如何用stdin stdout替换命令行参数sys.argv?
我意识到,我的问题非常简单,但我找不到任何将stdin标准输出实现为Python脚本的明确示例 我有一个脚本,可以很好地处理命令行参数:Python 如何用stdin stdout替换命令行参数sys.argv?,python,stdout,stdin,sys,Python,Stdout,Stdin,Sys,我意识到,我的问题非常简单,但我找不到任何将stdin标准输出实现为Python脚本的明确示例 我有一个脚本,可以很好地处理命令行参数: newlist = [] def f1() .... def f2(input_file): vol_id = sys.argv[3] for line in input_file: if ... : line = line.replace('abc','def') line = line.replac
newlist = []
def f1()
....
def f2(input_file):
vol_id = sys.argv[3]
for line in input_file:
if ... :
line = line.replace('abc','def')
line = line.replace('id', 'id'+vol_id)
....
newlist.append(line)
return newlist
def main():
if len(sys.argv) < 4:
print 'usage: ./myscript.py [file_in... file_out... volume_id]'
sys.exit(1)
else:
filename = sys.argv[1]
filename_out = sys.argv[2]
tree = etree.parse(filename)
extract(tree)
input_file = open(filename, 'rU')
change_class(input_file)
file_new = open(filename_out, 'w')
for x in newlist:
if '\n' in x:
x = x.replace('\n', '')
print>>file_new, x
然后我像这样运行我的脚本:
filename = sys.argv[1]
filename_out = sys.argv[2]
if filename == '-':
filename = sys.stdin
else:
input_file = open(filename, 'rU')
if filename_out == '-':
filename_out = sys.stdout
file_new = filename_out
else:
file_new = open(filename_out, 'w')
tree = etree.parse(filename)
extract(tree)
input_file = filename
change_class(input_file)
for x in newlist:
if '\n' in x:
x = x.replace('\n', '')
print>>file_new, x
./myscript.py - - volumeid < filein > fileout
./myscript.pyfilename = sys.argv[1]
filename_out = sys.argv[2]
if filename == '-':
filename = sys.stdin
else:
input_file = open(filename, 'rU')
if filename_out == '-':
filename_out = sys.stdout
file_new = filename_out
else:
file_new = open(filename_out, 'w')
tree = etree.parse(filename)
extract(tree)
input_file = filename
change_class(input_file)
for x in newlist:
if '\n' in x:
x = x.replace('\n', '')
print>>file_new, x
./myscript.py - - volumeid < filein > fileout
我尝试从命令行运行它,如下所示:
filename = sys.argv[1]
filename_out = sys.argv[2]
if filename == '-':
filename = sys.stdin
else:
input_file = open(filename, 'rU')
if filename_out == '-':
filename_out = sys.stdout
file_new = filename_out
else:
file_new = open(filename_out, 'w')
tree = etree.parse(filename)
extract(tree)
input_file = filename
change_class(input_file)
for x in newlist:
if '\n' in x:
x = x.replace('\n', '')
print>>file_new, x
./myscript.py - - volumeid < filein > fileout
/myscript.py--volumeidfileout
但是我仍然得到一个空的输出文件:(
stdin
或stdout
的公共占位符是-
:
./myscript.py - - volumeid
以及:
等等
此外,当存在少于3条命令行参数时,您可以默认“代码>文件名和<代码>文件名> />代码> <代码> ->代码>。您应该考虑使用专用命令行参数分析器,例如,它可以为您处理这些情况,包括默认为“代码> STDIN < /代码>和<代码> STDUD/<代码>,以及使用
-
作为旁注,我不会使用print
写入文件;我只会使用:
file_new.write(x)
这样就不需要去掉换行符了
您似乎从输入文件中读取了两次;一次是解析XML树,另一次是使用打开的文件对象调用change\u class()
。您试图在那里做什么?使用sys.stdin
复制该文件时会遇到问题,因为您无法以从磁盘上的文件重新读取流中的数据
您必须首先将所有数据读入内存,然后解析其中的XML,然后再次读取它以获得
change\u class()
。如果可能的话,最好使用解析后的XML树来进行此操作(例如,只读取一次文件,然后从此处开始使用解析后的结构).您可能会发现fileinput
模块很有用(在标准库中)@cdarke:fileinput
非常适合只需输入文件的情况。您仍然需要手动处理命令行参数并传入文件fileinput
应明确视为输入。注释不是发布代码的最佳位置。如果后续问题涉及更多的小说明,则可能是在一个新的问题需要被问。没错!这就是为什么我把我的代码作为一个答案放在下面哇,只使用实际答案的答案!并且票数相等的答案是随机排序的,所以我没有看到你的答案“下面”而是“上面”。好的,问题修改了