【问题标题】:Getting a TypeError: expected str, bytes or os.PathLike object, not InMemoryUploadedFile [duplicate]获取 TypeError:预期的 str、bytes 或 os.PathLike 对象,而不是 InMemoryUploadedFile [重复]
【发布时间】:2018-12-20 07:53:39
【问题描述】:
def post(self, request):
    form = CsvUploadForm(request.POST, request.FILES)

    if form.is_valid():
        with open(request.FILES['csv']) as csv_source:
            has_header = csv.Sniffer().has_header(csv_source.read(1024))
            csv_source.seek(0)
            reader = csv.DictReader(csv_source)
            ....
            ....

    return HttpResponse("file Uploaded")

使用上面的代码我正在尝试上传一个 csv 文件并阅读它。但我收到以下错误。

使用 open(request.FILES['csv']) 作为文件: TypeError: 预期的 str、bytes 或 os.PathLike 对象,而不是 InMemoryUploadedFile

我在这里缺少什么?

django 2.0.7 蟒蛇3.5

【问题讨论】:

  • 你不需要打开它,它已经是一个文件蒸汽。只需将其直接传递给 csv 函数即可。
  • @DanielRoseman,如果您可以将其添加为答案,我可以接受。谢谢

标签: python django


【解决方案1】:

正如@ Daniel Roseman所说,你可以直接使用filestream as,

def post(self, request):
    form = CsvUploadForm(request.POST, request.FILES)

    if form.is_valid():
        reader = csv.DictReader(request.FILES['csv'])
        ....
        ....

    return HttpResponse("file Uploaded")

【讨论】:

    【解决方案2】:

    尝试将请求读入 BytesIO 流,然后对该对象执行操作。

    def post(self, request):
        form = CsvUploadForm(request.POST, request.FILES)
    
        if form.is_valid():
            csv_source = BytesIO(request.FILES['csv'].read())
            has_header = csv.Sniffer().has_header(csv_source.read(1024))
            csv_source.seek(0)
            reader = csv.DictReader(csv_source)
            ....
            ....
    
        return HttpResponse("file Uploaded")
    

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 2022-01-17
      • 1970-01-01
      • 2019-11-15
      • 2018-11-08
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多