2017-02-14 2 views
0

У меня есть входной файл, который выглядит как this (inFile.txt):Как реализовать STDOUT и записи файлов на основе входных параметров

a x 
b y 
c z 

Я хочу реализовать программу, которая позволит пользователю писать STDOUT или файл в зависимости от команды:

python mycode.py infile.txt outfile.txt 

Будете писать в файл.

И с этим

python mycode.py infile.txt #2nd case 

будет писать STDOUT.

Я застрял с этим кодом:

import sys 
import csv 

nof_args = len(sys.argv) 
infile = sys.argv[1] 

print nof_args 
outfile = '' 
if nof_args == 3: 
    outfile = sys.argv[2] 

# for some reason infile is so large 
# so we can't save it to data structure (e.g. list) for further processing 
with open(infile, 'rU') as tsvfile: 
    tabreader = csv.reader(tsvfile, delimiter=' ') 

    with open(outfile, 'w') as file: 
     for line in tabreader: 
      outline = "__".join(line) 
      # and more processing 
      if nof_args == 3: 
       file.write(outline + "\n") 
      else: 
       print outline 
    file.close() 

При использовании второго случая он производит

Traceback (most recent call last): 
    File "test.py", line 18, in <module> 
    with open(outfile, 'w') as file: 
IOError: [Errno 2] No such file or directory: '' 

Что такое лучший способ это осуществить?

+0

Вы определяете 'outfile' в' stdout', когда 'nof_args == 2'? В противном случае 'с открытым (outfile, 'w') как файл:' будет терпеть неудачу. –

+0

Я вижу, что вы использовали мой 'len (sys.argv)' из вопроса, который вы удалили. У вас есть привычка удалять вопросы, как только вы получите ответ? –

ответ

2

Вы можете попробовать это:

import sys 

if write_to_file: 
    out = open(file_name, 'w') 
else: 
    out = sys.stdout 

# or a one-liner: 
# out = open(file_name, 'w') if write_to_file else sys.stdout 

for stuff in data: 
    out.write(stuff) 

out.flush() # cannot close stdout 

# Python deals with open files automatically 

Вы также можете использовать это вместо out.flush():

try: 
    out.close() 
except AttributeError: 
    pass 

Это выглядит немного некрасиво со мной, так, flush будет только хорошо.

+0

Можете ли вы уточнить мой пример for-loop и 'sys.argv'? – neversaint

+1

@neversaint, просто вызовите вызовы 'out.write' внутри цикла. – ForceBru

+1

@neversaint почти таким же образом: откройте файл для чтения или используйте 'sys.stdin', но не' flush' и используйте второй метод, указанный в ответе, чтобы попытаться закрыть файл. Вы также должны подставить 'write' для' read'. – ForceBru

Смежные вопросы