Отправка данных из кнопки импорта непосредственно в базу данных
Мне нужно импортировать 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>
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, и он довольно хорошо сформирован:
Я читал, что 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')