stdin stdout python: как повторно использовать один и тот же входной файл дважды?
Я довольно новичок в 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 <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
Что я делаю неправильно?