【问题标题】:Sending data from import button directly to database将数据从导入按钮直接发送到数据库
【发布时间】:2022-01-02 07:56:54
【问题描述】:

我需要做的是从html中导入一个txt文件:

<form method="post" enctype="multipart/form-data" action="/import_csv/">
      {% csrf_token %}
    <input type="file" name="document" class="btn btn-sm btn-primary shadow-sm"/>
    <input type="submit" class="btn btn-md btn-primary shadow-sm mr-1"></input>
</form>
我也尝试使用带有 onclick 事件的按钮,但得到了同样的错误,所以我转换为输入标签。表单标签上的操作是 view.py 中函数的名称,它执行以下操作:
def import_csv(request):
context = {}
# data from the txt files
if request.method == 'POST':
    my_file = request.FILES['document']
    txtData = my_file.read()
    html = txtData.decode('utf-8')
    df = pd.read_csv(html, delimiter='\t+|\t\t', header=1)
    print(df)
    df.rename(columns={'Type d’enregistrement': 'Type', 'Historique du taux de glucose (mg/dL)': 'GlucoseHistorique'},
          inplace=True)
    df.drop('Taux de glucose scanné (mg/dL)', inplace=True, axis=1)
    df.drop('Insuline à action rapide (sans valeur numérique)', inplace=True, axis=1)
    df.drop('Insuline à action rapide (unités)', inplace=True, axis=1)
    df.drop('Nourriture (sans valeur numérique)', inplace=True, axis=1)
    df.drop('Glucides (grammes)', inplace=True, axis=1)
    df.drop('Insuline à action lente (sans valeur numérique)', inplace=True, axis=1)
    df.drop('Insuline à action lente (unités)', inplace=True, axis=1)
    df.drop('Commentaires', inplace=True, axis=1)
    df.drop('Glycémie avec électrode de dosage (mg/dL)', inplace=True, axis=1)
    df.drop('Cétonémie (mmol/L)', inplace=True, axis=1)
    df.drop('Insuline repas (unités)', inplace=True, axis=1)
    df.drop('Insuline de correction (unités)', inplace=True, axis=1)
    df.drop('Insuline modifiée par l’utilisateur (unités)', inplace=True, axis=1)
    df.drop('Heure précédente', inplace=True, axis=1)
    df.drop('Heure mise à jour', inplace=True, axis=1)
    csvFile = df.to_csv('log.csv', index=None)
# Parsing the data
    reader = csv.reader(csvFile)
    header = []
    header = next(reader)
    rows = []
    for row in reader:
    # rows.append(row[1])
        deviceDate = format_date(row[1])
        Device.objects.create(patientId=1, deviceId=row[0], hour=deviceDate, type=row[2], glucoseValue=row[3])

#creating the context
    context = {
           "file_content": json.dumps(txtData)  # moving the data to frontend
           }
return render(request, "index.html", context=context)

之前我尝试将本地 txt 文件放在主文件夹中并将其转换为 log.csv(如代码中所示)并且它有效。在我将逻辑从导入按钮转换为工作后(所以我不需要每次都将 txt 放入本地文件夹),一切都出错了。我试图解码它,因为它给了我“不能在类似字节的对象上使用字符串模式”。

现在我想把它放回 csv,但是 pd.read_csv 给了我以下错误:

“没有这样的文件或目录:'John Doe\r\nID\tHeure\tType d'enregistrement\tHistorique du taux de gel (mg/dL)\tTaux deglucose scanné (mg/dL)\tInsuline à action rapide (sans valeur numérique)\tInsuline à action rapide (unités)\tNourriture (sans valeur numérique)\tGlucides (grammes)\tInsuline à action lente (sans valeur numérique)\tInsuline à action lente (unités)\tCommentaires\tGlycémie avec électrode de剂量 (mg/dL)\tCétonémie (mmol/L)\tInsuline repas (unités)\tInsuline de correction (unités)\tInsuline modifiée par l'utilisateur (unités)\tHeure precédente\tHeure mise à jour\r\n40344\t2021 /08/30 01:48\t1\t\t92\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n40348\t2021/08/ 30 02:16\t1\t\t99\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n40354\t2021/08/30 03: 06\t1\t\t109\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n40360\t2021/08/30 04:06\t1 \t\t120\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n40371\t2021/08/30 06:28\t1\t\ t122\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n40388\t2021/08/30 10:15\t1\t\t74\t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n40390\t2021/08/30 10 :21\t1\t\t74\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n40393\t2021/08/30 10:26\ t1\t\t74\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n40401\t2021/08/30 12:01\t1\t \t142\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n40411\t2021/08/30 13:55\t1\t\t59\ t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n40419\t2021/08/30 15:28\t1\t\t214\t\t \t\t\t\t\t\t\t\t\t\t\t\t\r\n40429\t2021/08/30 17:32\t1\t\t230\t\t\t\ t\t\t\t\t\t\t\t\t\t\t\r\n40434\t2021/08/30 18:23\t1\t\t196\t\t\t\t\t \t\t\t\t\t\t\t\t\t\r\n40439\t2021/08/30 19:03\t1\t\t142\t\t\t\t\t\t\ t\t\t\t\t\t\t\r\n40441\t2021/08/30 19:07\t1\t\t141\t\t\t\t\t\t\t\t \t\t\t\t\t\t\r\n40449\t2021/08/30 20:37\t1\t\t60\t\t\t\t\t\t\t\t\t\ t\t\t\t\t\r\n40453\t2021/08/30 20:58\t1\t\t42\t\t\t\t\t\t\t\t\t\t\t \t\t\t\r\n40457\t2021/08/30 21:28\t1\t\t146\t\t\t\t\t\t\t\t\t\t\t\t\ t\t\r\n40461\t2021/08/30 22:05\t1\t\t193\t'"

我还尝试打印 html,它的格式非常好:

我读到 pd.read_csv 只能看到一个路径,所以我的问题是:在尝试格式化 csv 时我应该采取什么方法或什么方法不会出错,这样我就可以将每一列保存在数据库中。

我希望它不会太长,并提前感谢所有试图帮助我的人。

【问题讨论】:

    标签: python html django pandas


    【解决方案1】:

    看起来您是先导入熊猫 df,然后尝试将 df 保存到数据库。试试这个 python 代码:

    连接到您的数据库

        from sqlalchemy import create_engine
        engconnect = "{0}://{1}:{2}@{3}:{4}/{5}".format(dialect,user_uenc, pw_uenc, host, port, dbname)    
        dbengine = create_engine(engconnect)
        database = dbengine.connect()
    

    将您的 df 保存到数据库中,在这种情况下,如果表存在则替换它

        df.to_sql('my_table_name', con=database, if_exists='replace')
    

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      相关资源
      最近更新 更多