Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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 stdout替换命令行参数sys.argv?_Python_Stdout_Stdin_Sys - Fatal编程技术网

Python 如何用stdin stdout替换命令行参数sys.argv?

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

我意识到,我的问题非常简单,但我找不到任何将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.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.pyoutputfile

它产生了一个空的输出文件,但根本没有发出任何错误消息

你能帮我更换一下吗

另外,我修改了main()如下:

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
我尝试从命令行运行它,如下所示:

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
应明确视为输入。注释不是发布代码的最佳位置。如果后续问题涉及更多的小说明,则可能是在一个新的问题需要被问。没错!这就是为什么我把我的代码作为一个答案放在下面哇,只使用实际答案的答案!并且票数相等的答案是随机排序的,所以我没有看到你的答案“下面”而是“上面”。好的,问题修改了