我对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添加到它时,我首先遇到了首先读取相同输入文件的问题,并且因此制作了一些chages以便它实际上只打开一次。这是我修改过的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&lt; inputfile&gt; 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
我做错了什么?
答案 0 :(得分:1)
您正在尝试将打开的文件对象用作文件名:
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
以处理字符串,而不是打开文件对象。