python - 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 是否有效并不理想,所以如果有人有任何建议,我愿意接受。
解决方案
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 要求它采用字符串形式。我不知道这是否是验证的好方法,但是是的。
推荐阅读
- java - java.lang.UnsatisfiedLinkError:java.library.path 中没有 mkl_rt
- c++ - 如何让代码在qt中等待接收信号
- r - 在循环中使用列表中的两个项目
- excel - Worksheet_Change 公式适用于数字,但适用于字符串
- json - 在哪里可以找到用于实体提取的精确 GOOGLE ML json 规范?
- python - 点云的视差图已关闭
- openssl - 使用 Cygwin x64 构建 LibreOffice 时找不到 openssl 标头
- boot - xorriso:boot.catalog 和 -eltorito-catalog 不起作用
- snakemake - Snakemake,使用 glob_wildcards 跳过子目录的任何方式
- sql - CS50 Pset 7 13.sql,我解决不了,嵌套sqlite3数据库