在CSV上迭代并验证上传的大文件

2024-10-06 11:24:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Django模块django-chunked-upload来接收可能很大的CSV文件。我可以假设csv的格式是正确的,但是我不能假设定界符是什么。在

上传完成后,返回一个UploadedFile对象。我需要验证上传的CSV中是否包含正确的列,以及每列中的数据类型是否正确。在

csv.reader()加载文件无效:

reader = csv.reader(uploaded_file)
next(reader)
>>> _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

这可能是因为uploaded_file.content_type和{}都是以None的形式出现的。在

我想出了一个相当不雅观的解决方案来获取标题并迭代行:

^{pr2}$

我还考虑过尝试加载实际保存的文件的路径:

path = #figure out the path of the temp file
f = open(path,"r")
reader = csv.reader(f)

但我无法从UploadedFile对象获取临时文件路径。在

理想情况下,我想从UploadedFile对象创建一个普通的读取器或DictReader,但它似乎在逃避我。有人有什么想法吗?-谢谢


Tags: 模块文件csvthepath对象django路径
1条回答
网友
1楼 · 发布于 2024-10-06 11:24:56

答案在于chunked_upload/模型.py其中有一行:

def get_uploaded_file(self):
    self.file.close()
    self.file.open(mode='rb')  # mode = read+binary
    return UploadedFile(file=self.file, name=self.filename,
                        size=self.offset)

因此,在创建文件模型时,可以选择使用mode='r'打开文件:

^{pr2}$

这允许您获取返回的UploadedFile实例并将其解析为csv:

def on_completion(self, uploaded_file, request):
    reader = csv.reader(uploaded_file)
    ...

相关问题 更多 >