ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

stdin stdout python:如何重复使用同一输入文件两次?

2019-10-13 13:06:06  阅读:233  来源: 互联网

标签:python stdin stdout


我对Python很陌生,对stdin stdout方法甚至更新.不过,我需要使我的脚本可用于UNIX命令,以便例如使用我的脚本一次处理2个输入文件.
该脚本与命令行参数完美配合:

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

当我尝试向其添加stdin stdout时,首先遇到一个问题,即首先读取相同的输入文件,并且由于这个原因进行了一些修改,因此实际上只能打开一次.这是我修改过的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')

            input_file = open(filename, 'rU')
            tree = etree.fromstring(input_file)
            extract(tree)

            change_class(input_file)

            for x in newlist:

                if '\n' in x:                   
                   x = x.replace('\n', '')                
                print>>file_new, x

然后我像这样运行我的脚本:

./myscript.py–volumeid<输入文件>输出文件

我得到了这个错误信息:

Traceback (most recent call last):
  File "./myscript.py", line 191, in <module>
    main()
  File "./myscript.py", line 175, in main
    input_file = open(filename, 'rU')
TypeError: coercing to Unicode: need string or buffer, file found

我究竟做错了什么?

解决方法:

您正在尝试使用打开的文件对象作为文件名:

filename = sys.stdin

# ...

input_file = open(filename, 'rU')

无论如何,您不能从sys.stdin重新读取;您需要将所有文件读入内存,然后对其进行两次处理:

if filename == '-':
    input_file = sys.stdin
else:
    input_file = open(filename, 'rU')

input_data = input_file.read()

tree = etree.fromstring(input_data)
extract(tree)

change_class(input_data)

在这里,您必须更改change_class来处理字符串,而不是打开文件对象.

标签:python,stdin,stdout
来源: https://codeday.me/bug/20191013/1908142.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有