Python-上传CSV文件后的CSV嗅探器

Python-上传CSV文件后的CSV嗅探器,python,django,pandas,csv,Python,Django,Pandas,Csv,我有这个上传csv的代码,我试图用csv.Sniffer检查csv是否有一个头,但是.has_头抱怨它以字节的形式出现。在MemoryUploadedfile中嗅探的正确方法是什么 我还意识到,使用sniffer和pandas检查csv是否有效并不理想,所以如果有人有任何建议,我愿意接受 def post(self, request, *args, **kwargs): uploaded_file = request.FILES['file'] if len(uploaded_

我有这个上传csv的代码,我试图用csv.Sniffer检查csv是否有一个头,但是.has_头抱怨它以字节的形式出现。在MemoryUploadedfile中嗅探的正确方法是什么

我还意识到,使用sniffer和pandas检查csv是否有效并不理想,所以如果有人有任何建议,我愿意接受

def post(self, request, *args, **kwargs):
    uploaded_file = request.FILES['file']

    if len(uploaded_file) != 0:
        try:
            df = pd.read_csv(uploaded_file)
            id = str(uuid.uuid4())

            read_file = uploaded_file.read(1024)
            if not csv.Sniffer().has_header(read_file):
                df = pd.DataFrame(df.values, columns=[n for n in range(len(df.columns))])

            df.to_csv(f'{TRAIN_FILES}/{id}.csv', index=False)
        except Exception as e:
            return JsonResponse({'msg': str(e)}, status=500)
        
        return JsonResponse({'msg': id}, status=200)
    else:
        return JsonResponse({'msg': 'File is empty'}, status=500)

这是我提出的解决方案,因为嗅探器的头要求它是字符串形式。我不知道这是否是一个验证的好方法,但是是的。

是吗?@Asmus不,很遗憾,我确实看到了这篇文章,它没有任何帮助。他们使用的是不同的csv函数。如果它工作正常,那么就可以了。但是,如果文件很大呢?然后熊猫需要读取整个文件。最佳解决方案是以二进制模式读取前几行,并将其二进制表示形式转换为字符串(就像您所做的那样),然后将其传递给sniffer仅用于验证,而不是保存。我使用Pandas只是为了确保整个csv格式正确。比如最后一行的逗号分隔不正确,或者熊猫应该抛出一个错误。
            df = pd.read_csv(uploaded_file)
            id = str(uuid.uuid4())

            # Convert to string for sniffer
            stringIO = io.StringIO()
            df.to_csv(stringIO)
            
            if not csv.Sniffer().has_header(stringIO.getvalue()):
                df = pd.DataFrame(df.values, columns=[n for n in range(len(df.columns))])

            df.to_csv(f'{TRAIN_FILES}/{id}.csv', index=False)