Отправка данных из кнопки импорта непосредственно в базу данных

Мне нужно импортировать txt файл из html:

<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, но получил ту же ошибку, поэтому я преобразовал ее в тег input. Действие в теге формы - это имя функции в 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 glucose (mg/dL)\tTaux de glucose scanné (mg/dL)\tInsuline à action rapide (sans (без цифрового обозначения)\tИнсулин быстрого действия (единицы)\tНорритура (без цифрового обозначения)\tГлюциды (граммы)\tИнсулин слабого действия (без цифрового обозначения)\tИнсулин слабого действия (без цифрового обозначения) numérique)\tInsuline à action lente (unités)\tCommentaires\tGlycémie avec électrode de dosage (mg/dL)\tCétonémie (mmol/L)\tInsuline repas (единицы)\tИнсулин коррекции (единицы)\tИнсулин, измененный пользователем (единицы)\tЧерез некоторое время\tЧерез некоторое время\tЧерез некоторое время\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\t\r\n40360\t2021/08/30 04:06\t1\t\t120\t\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\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\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, и он довольно хорошо сформирован: html variable format

Я читал, что pd.read_csv может видеть только путь, поэтому мой вопрос: Какой метод или что я должен сделать, чтобы не получить ошибку при попытке форматирования csv, чтобы я мог сохранить каждый столбец в базе данных.

Надеюсь, это не слишком длинно и заранее спасибо всем, кто пытается мне помочь.

Похоже, что вы сначала импортируете в pandas 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')
Вернуться на верх