【问题标题】:python csv library I/O operation on closed filepython csv库对关闭文件的I/O操作
【发布时间】:2015-02-27 12:30:02
【问题描述】:

在 csv_reader 中循环每一行时,我遇到了“关闭文件的 I/O 操作”问题。

这是我的代码:

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()

【问题讨论】:

  • 你应该编辑你的previous question
  • 那只是一个访客账户,我需要一个真实账户
  • 好吧,我没注意用户名
  • 好的,关于修复有什么想法吗?
  • @will 尝试将 logFile 变量作为第一个参数直接传递给 csv.DictReader

标签: python python-2.7 csv file-upload file-io


【解决方案1】:

LogFile的类型是:

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

对于with logFile as csv_file: 语句,您需要文件对象,即&lt;type 'file'&gt;

您需要将LogFile保存到文件中,然后再次打开文件以进行下一个过程。

【讨论】:

  • 如何保存到文件中?
【解决方案2】:

首先读取文件。您可能想尝试类似的方法:

data = [row for row in csv.DictReader(csv_file.read(), fieldnames=field_names,
           delimiter=delimiter, quotechar=quote_character)]

【讨论】:

    【解决方案3】:

    这种方法假设您的 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
    

    【讨论】:

    • @will 你能在 read() 之前尝试 log_file.seek(0) 吗?我将编辑答案代码。
    • 这给了我另一个错误: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) IndexView 128 中的文件“/home/vcap/app/BillingWebApp/views.py”。csv_list_dict = csv_getting_list_dict.Csv_Parser(logFile) 文件“/home/vcap/app/BillingWebApp /csv_getting_list_dict.py" in Csv_Parser 5. log_file.seek(0) 异常类型:ValueError at / 异常值:对已关闭文件的 I/O 操作。
    • 我看不到文件关闭的原因,你以前用过吗?您是否将其传递给表单然后对其进行验证?
    • @avernet 现在 seek(0) 出现问题
    • 嗯,帖子在视图中,然后我将从帖子中获得的文件传递给给我这些错误的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2016-03-06
    • 1970-01-01
    相关资源
    最近更新 更多