首页 > 解决方案 > 当我从 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')

标签: pythonpandascsv

解决方案


我认为这里有一些问题。

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()

推荐阅读