stdin stdout python:如何重复使用相同的输入文件两次? [英] stdin stdout python: how to reuse the same input file twice?
问题描述
我对 Python 很陌生,甚至对 stdin 标准输出方法也很陌生.尽管如此,我需要使我的脚本可用于 UNIX 命令,以便例如可以使用我的脚本一次处理 2 个输入文件.此脚本与命令行参数完美配合:
I am quite new to Python and even newer to stdin stdout method. Nevertheless I need to make my script usable for UNIX commands, in order to make it possible for example to process 2 input files at once with my script. This script works perfectly well with command line arguments:
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 标准输出时,我首先在读取相同的输入文件时遇到问题,因此进行了一些更改,以便它实际上只打开一次.这是我修改后的 main():
When I tried to add stdin stdout to it, I first had a problem with reading the same input file first, and for this reason made some chages so that it would be actually open only once. Here is my modified 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
然后我像这样运行我的脚本:
Then I ran my script like this:
./myscript.py - - volumeid <输入文件 > 输出文件
./myscript.py - - volumeid < inputfile > outputfile
我收到此错误消息:
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
我做错了什么?
推荐答案
您正在尝试使用打开的文件对象作为文件名:
You are trying to use an open file object as a filename:
filename = sys.stdin
# ...
input_file = open(filename, 'rU')
无论如何你都不能从 sys.stdin
重新读取;您需要将所有文件读入内存,然后处理两次:
You cannot re-read from sys.stdin
anyway; you need to read all of the file into memory, then process it twice:
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
来处理字符串,而不是打开的文件对象.
mwhere you'll have to alter change_class
to handle a string, not an open file object.
这篇关于stdin stdout python:如何重复使用相同的输入文件两次?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!