Python-上传CSV文件后的CSV嗅探器
我有这个上传csv的代码,我试图用csv.Sniffer检查csv是否有一个头,但是.has_头抱怨它以字节的形式出现。在MemoryUploadedfile中嗅探的正确方法是什么 我还意识到,使用sniffer和pandas检查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_
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)