2014-12-23 2 views
0

У меня есть сценарий python, который получает имена входных файлов из командной строки. Я создал список для хранения всех входных файлов и передал их функции для создания нового файла со всеми входящими файлами, объединенными сразу. Теперь я передаю этот новый файл в качестве ввода другой функции. Я получаю сообщение об ошибкеЗапись и чтение нового файла путем передачи файлов в качестве аргумента функции в скрипте python

TypeError: Принуждение к Unicode: нужно строка или буфер, список найден

Код:

file_list = []                                                                               
for arg in range(1,len(sys.argv)-2):  
    file_list.append(sys.argv[arg]) 
    process_name = sys.argv[len(sys.argv)-1] 
integrate_files(file_list,process_name) 

def integrate_files(file_list,process_name): 
    with open('result.log', 'w') as result:   
     for file_ in file_list: 
      for line in open(file_, 'r'): 
      result.write(line) 
    start_process(result,process_name) 

def start_process(result,process_name): 
    with open(result,'r') as mainFile: 
     content = mainFile.readlines() 

Я получаю эту ошибку освещались на линиях, имеющих слово с.open(). Я попытался распечатать abspath файла result.log. Он напечатал закрытый файл 'result.log', режим 'w' на 0x000000000227578. Где я иду не так? Как создать новый файл и передать его функции?

ответ

1

Ваша проблема заключается в том, что result является закрытым объектный файл:

start_process(result,process_name) 

Я думаю, что вы хотите

start_process('result.log', process_name) 

Вы можете очистить сценарий немного с

import shutil 
                          file_list = sys.argv[1:-1] 
process_name = sys.argv[-1] 
integrate_files(file_list,process_name) 

def integrate_files(file_list,process_name): 
    with open('result.log', 'w') as result:   
     for file_ in file_list: 
      with open(file_) as infile: 
       shutil.copyfileobj(infile, result) 
    start_process('result.log',process_name) 

def start_process(result,process_name): 
    with open(result,'r') as mainFile: 
     content = mainFile.readlines() 
1

выпуск есть здесь:

with open('result.log', 'w') as result:   
    # ... 
start_process(result,process_name) 

Поскольку вы снова откройте файл в start_process, вы должны просто передать имя:

start_process(result.name, process_name) 

Или просто быть явным:

start_process('result.log', process_name) 
1

Когда вы пишете with open('result.log', 'w') as result:, вы делаете result быть объект, представляющий фактический файл на диске. Это отличное от имя файла.

Вы, безусловно, можете передать это result другой функции. Но так как это будет фактический файловый объект, а не имя файла, вы не можете передать его на open - open ожидает имя файла и ищет файл с этим именем, чтобы создать новый файловый объект.

Вы можете вызвать методы в этом файловом объекте, но ни один из них не будет повторно открывать файл. Вместо этого самое простое - запомнить и передать имя файла, так что start_process может open его снова.

Как показано в ответе @ matsjoyce, файл-объект запоминает исходное имя файла. Итак, вы можете передать объект, и получите start_process получите имя. Но это грязно. Действительно, просто передайте имя. (Вы могли бы, как показали маты, передать result.name явно вместо того, чтобы сначала создать свою собственную переменную name).Передача объектов с файлами обычно не является тем, что вы хотите - делайте это только тогда, когда вы хотите разделить работу чтения/записи по функциям (и для этого есть веская причина).

0

В этом:

with open('result.log', 'w') as result: 

При определении result выше, вы только определив его для этого одного цикла, поэтому он не будет проходить, когда вы звоните start_process

Так как изменение start_process в:

with open('result.log','r') as mainFile: 

Или вы могли бы передать строку result.log в start_process вместо переменной result:

file_list = []                                                                               
for arg in range(1,len(sys.argv)-2):  
    file_list.append(sys.argv[arg]) 
    process_name = sys.argv[len(sys.argv)-1] 
integrate_files(file_list,process_name) 

def integrate_files(file_list,process_name): 
    with open('result.log', 'w') as result:   
     for file_ in file_list: 
      for line in open(file_, 'r'): 
      result.write(line) 
    start_process('result.log',process_name) 

def start_process(result,process_name): 
    with open(result,'r') as mainFile: 
     content = mainFile.readlines() 
Смежные вопросы