python - 当我从 Flask 下载 CSV 时,数据未写入 CSV
问题描述
我有一个 CSV,其中包含一个月内各种社交媒体应用程序上的用户活动数据 这是一个片段
供您参考:这是csv的内容
date_time;timestamp;Instagram;Facebook;Snapchat;Twitter;TikTok;YouTube
2020-08-23__04:16:00.705612;1598148961;N;N;N;N;Y;N
2020-08-23__04:17:02.308588;1598149022;N;N;N;N;Y;N
2020-08-23__04:18:03.944537;1598149084;N;N;N;Y;Y;N
这包含超过 50,000 条记录。现在,当我通过我的 Flask 应用程序上传这个 csv 并对其进行更改并下载它时,它确实被下载了,这就是我得到的。
我在代码中所做的只是上传 CSV,并将“date_time”的格式从 (YM-D__H-MS.ms) 更改为 (YMD HMS.ms),当我下载新文件时,数据未正确写入 csv
这是我的相同代码
from flask import Flask, flash, render_template, request, make_response
import pandas as pd
import datetime
import csv
import io
@app.route('/mainPage', methods=['GET', 'POST'])
def upload_csv():
if request.method=='POST':
f=request.form['csvfile']
dataset=pd.read_csv(f)
df=pd.DataFrame(dataset, columns=list(dataset.columns))
date_time=[]
dt=df['date_time']
for i in range(len(dt)):
cons=dt[i] #considering the current datetime object
cons=cons.replace('__', ' ')
date_time_obj = datetime.datetime.strptime(cons, '%Y-%m-%d %H:%M:%S.%f')
date_time.append(date_time_obj)
df.drop(columns='date_time')
col = df.columns.tolist()
df['date_time']=date_time
df = df[(['date_time']+col[1:])]
si = io.StringIO()
cw = csv.writer(si)
cw.writerows(df)
output = make_response(si.getvalue())
output.headers["Content-Disposition"] = "attachment; filename=new.csv"
output.headers["Content-type"] = "text/csv"
return output
return render_template('home.html')
解决方案
我认为这里有一些问题。
df.drop(columns='date_time')
应该
df = df.drop(columns='date_time')
或者
df.drop(columns='date_time', inplace=True)
接下来,新数据的插入对我来说听起来过于复杂。你可以做
df.insert(loc=0, column="date_time", value=date_time)
最后,所有复杂的 CSV 输出可能更容易使用
df.to_csv(index=False)
这是我的完整代码(仅限 Python,没有 Flask):
import pandas as pd
import datetime
from io import StringIO
csvdata = StringIO("""
date_time;timestamp;Instagram;Facebook;Snapchat;Twitter;TikTok;YouTube
2020-08-23__04:16:00.705612;1598148961;N;N;N;N;Y;N
2020-08-23__04:17:02.308588;1598149022;N;N;N;N;Y;N
2020-08-23__04:18:03.944537;1598149084;N;N;N;Y;Y;N""")
def upload_csv():
dataset=pd.read_csv(csvdata, delimiter=";")
df=pd.DataFrame(dataset, columns=list(dataset.columns))
date_time=[]
dt=df['date_time']
for i in range(len(dt)):
cons=dt[i] #considering the current datetime object
cons=cons.replace('__', ' ')
date_time_obj = datetime.datetime.strptime(cons, '%Y-%m-%d %H:%M:%S.%f')
date_time.append(date_time_obj)
df.drop(columns='date_time', inplace=True)
df.insert(loc=0, column="date_time", value=date_time)
return df.to_csv(index=False)
output = upload_csv()
推荐阅读
- apache-spark - 火花工作卡住的原因可能是什么
- matlab - 编辑最小二乘线的 x 限制
- azure-application-insights - 如何更改 Live Metrics Stream 中的图表间隔
- angular - 如何使用 Angular 在本地运行 service worker
- php - 我的 php 代码不会将用户添加到 MySQL 数据库
- python - 为什么我的函数附加文件名字符串而不是文件本身的行?
- javascript - 当结果为四舍五入时(1.10 1.30)不显示小数点后二位怎么办?
- mathematical-optimization - 目标函数中带有符号的最小成本最大流
- youtube-data-api - 检索视频时出现“未配置访问”错误。以前工作正常
- scala - 如何使用scala将字符串转换为整数?