2014-12-31 2 views
0

Я столкнулся с проблемой «операции ввода-вывода при закрытом файле», когда для циклизации каждой строки в csv_reader.python csv library Операция ввода-вывода в закрытом файле

Это мой код:

logFile = request.FILES['logs'] 
array = [] 
with logFile as csv_file: 
    field_names = ['hi', 'hi', 'hello', 'hello' ] 
    delimiter = ',' 
    quote_character = '"' 
    csv_reader = csv.DictReader(csv_file, fieldnames=field_names , delimiter = delimiter, quotechar = quote_character) 
    count = 0 
    for rows in csv_reader: 
     if count == 0: 
      print count 
     else: 
      print count 
      array.append(rows) 
     count += 1 

return array 

LOGFILE фактический файл CSV, который был загружен пользователем, а не путь.

Traceback: 
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py" in  get_response 
    111. response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/home/vcap/app/BillingWebApp/views.py" in IndexView 
    128. csv_list_dict = csv_getting_list_dict.Csv_Parser(logFile) 
File "/home/vcap/app/BillingWebApp/csv_getting_list_dict.py" in Csv_Parser 
    5. with logFile.open() as csv_file: 
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/files/uploadedfile.py" in open 
    97. self.file.seek(0) 

Exception Type: ValueError at/
Exception Value: I/O operation on closed file. 

Ошибка возникает в моем коде по адресу:

for rows in csv_reader: 

и в отладчике он получает это:

row = self.reader.next() 
+0

Вы должны изменить свой [предыдущий вопрос] (http://stackoverflow.com/questions/27719691/csv-library-error-io-operation-on-closed- файл). – fredtantini

+0

это не позволило бы мне – will

+0

, и это была только гостевая учетная запись, и мне нужен был реальный счет – will

ответ

0

Тип LogFile является:

<class 'django.core.files.uploadedfile.InMemoryUploadedFile'> 

для with logFile as csv_file: statem вам нужен файловый объект, т. е. <type 'file'>.

Вам необходимо сохранить LogFile в файл и затем снова открыть файл для следующего процесса.

+0

как сохранить его в файл? – will

0

Этот подход предполагает ваши CSV файлы могут быть загружены в память:

from cStringIO import StringIO 

log_file = request.FILES['logs'] 
log_file.seek(0) 
log_file_content = log_file.read() 
in_memory_log_file = StringIO(log_file_content) 

array = [] 

field_names = ['hi', 'hi', 'hello', 'hello' ] 
delimiter = ',' 
quote_character = '"' 
csv_reader = csv.DictReader(in_memory_log_file, fieldnames=field_names , 
          delimiter = delimiter, quotechar = quote_character) 
count = 0 
for row in csv_reader: 
    if count == 0: 
     print count 
    else: 
     print count 
     array.append(row) 
    count += 1 

return array 
+0

log_file.read() возвращает пустую строку – will

+0

@will Можете ли вы попробовать log_file.seek (0) перед read()? Я отредактирую код ответа. – avenet

+0

, что дает мне еще одну ошибку: Traceback: Файл «/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py» в get_response 111. response = wrapped_callback (запрос , * callback_args, ** callback_kwargs) Файл "/home/vcap/app/BillingWebApp/views.py" в IndexView 128. csv_list_dict = csv_getting_list_dict.Csv_Parser (LOGFILE) Файл «/ главная/VCAP/приложение/BillingWebApp/csv_getting_list_dict .py "в Csv_Parser 5. log_file.seek (0) Тип исключения: ValueError at/ Значение исключения: операция ввода-вывода в закрытом файле. – will

0

Прочитайте файл первым. Вы можете попробовать что-то вроде этого:

data = [row for row in csv.DictReader(csv_file.read(), fieldnames=field_names, 
      delimiter=delimiter, quotechar=quote_character)] 
Смежные вопросы