首页 > 解决方案 > Python - POST上传的csv文件上的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)

我有这个用于上传 csv 的代码,我正在尝试使用 csv.Sniffer 检查 csv 是否有标题,但是 .has_header 抱怨它以字节的形式出现。嗅探 InMemoryUploadedFile 的正确方法是什么?

我也意识到使用嗅探器和熊猫检查 csv 是否有效并不理想,所以如果有人有任何建议,我愿意接受。

标签: pythondjangopandascsv

解决方案


            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)

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


推荐阅读