【问题标题】:Getting Type error while opening an uploaded CSV File打开上传的 CSV 文件时出现类型错误
【发布时间】:2012-05-23 22:36:06
【问题描述】:

我正在用 django 在 python 中开发一个应用程序。用户可以上传 CSV 文件。我使用文件上传来获取文件。但是,它没有存储在任何地方。我尝试从请求中获取它来处理文件。当我试图打开文件时,它给出了一个错误。我使用python中存在的CSV库来处理。按照 django 使用的表单元素和属性。我尝试获取上传文件的请求对象也是django设计的对象。

import csv
from rootFolder.UploadFileForm

def uploadFile(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            paramFile = open(request.FILES['uploadFile'], 'rb')
            portfolio = csv.DictReader(paramFile)
            users = []
            for row in portfolio:
                users.append(row)

下面这行给出了错误。

paramFile = open(request.FILES['uploadFile'], 'rb')

给定的错误是:

TypeError: coercing to Unicode: need string or buffer, InMemoryUploadedFile found

如果您对此有任何想法,请提出您的建议。 提前致谢。

【问题讨论】:

    标签: python django file-upload csv django-forms


    【解决方案1】:

    这适用于 Python 3

    import csv
    import io
    
    ...
    
    csv_file = request.FILES['uploadFile']
    decoded_file = csv_file.read().decode('utf-8')
    io_string = io.StringIO(decoded_file)
    for line in csv.reader(io_string, delimiter=';', quotechar='|'):
        print(line)
    

    【讨论】:

      【解决方案2】:

      不需要对文件调用 open,它已经打开了。您应该能够将其直接传递到 DictReader。

      【讨论】:

        【解决方案3】:

        open() 将文件名作为参数,而不是文件对象本身。

        你可以试试这样的:

        paramFile = request.FILES['uploadFile'].read()
        portfolio = csv.DictReader(paramFile)
        

        【讨论】:

        • 这会产生一个 IO 错误 Error is IOError: [Errno 2] No such file or directory: u'Magazine.csv' 感谢您的建议
        • 我的错,但基本上这个想法是获取上传文件的路径。试试我刚刚编辑的那个。
        • 这给出了一个属性错误。我以前也试过这个。给定错误是 AttributeError: 'InMemoryUploadedFile' 对象没有属性 'temporary_file_path'
        • 根据文档有一个 read() 方法,我试过了,这行得通。
        • 我收到此错误:_csv.Error: iterator 应该返回字符串,而不是 int(您是否以文本模式打开文件?)
        【解决方案4】:

        Django 2,Python 3.6,同样的问题,谷歌搜索了半天,这是对我有用的解决方案。

        form.is_valid:
          csv_file = request.FILES['file']
          csv_file.seek(0)
          reader = csv.DictReader(io.StringIO(csv_file.read().decode('utf-8')))
        
          for row in reader
             .....
             .....
        

        详细的文章在这里 -> source

        【讨论】:

        • 这不是上面 Mark Mishyn 的回答吗? :D
        • 不,检查我发布的链接
        • 为什么不呢?您使用 .DictReader() 而不是 .reader() 的唯一区别。
        • 这不是区别吗?另外,你想证明什么?
        【解决方案5】:

        您会收到 TypeError,因为内置函数 open 需要一个作为文件路径的字符串。

        这行得通吗?

            if form.is_valid():
                request.FILES['uploadFile'].open("rb")
                portfolio = csv.DictReader(request.FILES['uploadFile'].file)
        

        【讨论】:

        • 我认为文件对象没有 open() 方法
        • 它不工作。它说“NoneType:无”.. 感谢您的建议
        • 编辑了建议。 InMemoryUploadedFile 类实现了来自django.core.files module 的 open 方法
        • Edited request.FILES['uploadFile'].file- 这个属性应该引用底层的python文件对象。
        猜你喜欢
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-14
        • 2022-01-19
        • 2020-01-16
        相关资源
        最近更新 更多