【问题标题】:how to import data from .csv file to django sqlite using import.py如何使用 import.py 将数据从 .csv 文件导入 django sqlite
【发布时间】:2018-09-29 07:10:30
【问题描述】:

我想从 csv 文件中检索数据,但我的硬件 (RFID) 输出为我提供了同一员工的两个不同条目用于时间和超时 WorkNames.csv

在这有两个条目,我只希望 models.py Employee 类中的一名员工只有一行

所以请在我的 METHOD1 中提供帮助,建议一些代码可以将 2 行合二为一,同时将数据传输到 sqlite

通过建议一些代码从 output.csv 导入数据来帮助 METHOD2

方法一:我使用import.py来导入数据。数据被导入到 sqlite 但双条目

import os
import sys
import csv
from datetime import datetime

project_dir='catalog'
sys.path.append(project_dir)

os.environ['DJANGO_SETTINGS_MODULE']='locallibrary.settings'
import django
django.setup()

from catalog.models import employee1
data=csv.reader(open('locallibrary/WorkNames.csv'),delimiter=',')
i=1
from datetime import datetime

for row in data:
    if row[0]== '':
        break
    else:


    Employee1=employee1()
    Employee1.Date=row[0]
    Employee1.Name=row[1]
    Employee1.Number=row[2]
    if row[3] =="" or row[3]=='Time IN':
        Employee1.Time_IN='00:00:00 AM'
    else:
        Employee1.Time_IN=str(row[3])

    if row[4] =="" or row[4]=='Time OUT':

        Employee1.Time_OUT='00:00:00 AM'
    else:
        Employee1.Time_OUT=str(row[4])

    Employee1.save()

**方法2:但是为了在行中获得超时时间,我生成了一个新文件**output.csv

文件生成正确,但数据没有从 csv 导入到 sqlite

import os
import sys
import csv
from datetime import datetime

project_dir='catalog'
sys.path.append(project_dir)

os.environ['DJANGO_SETTINGS_MODULE']='locallibrary.settings'
import django

django.setup()

from catalog.models import employee1
data=csv.reader(open('locallibrary/WorkNames.csv'),delimiter=',')

from datetime import datetime
lines=list(data)

r=5
c=5

for i in range(r):
    for j in range(1,5):
        if lines[0][j]=="":
            break

        if lines[i][2] == lines[j][2]:
            lines[j][3]=lines[i][3]

r=5
c=5

for i in range(r):
    for j in range(1,5):
        if lines[i][3]!="" and lines[i][4]=="":
            lines[i][3]='00:00:00 AM'
            lines[i][4]='00:00:00 AM'
            break


writer = csv.writer(open('locallibrary/output.csv', 'w'))
for r in lines:
    writer.writerow(r)

open('locallibrary/output.csv').close()


data1=csv.reader(open('locallibrary/WorkNames.csv'),delimiter=',')
i=1

for row in data:
    if row['Date']=='':
            break
    else:
        Employee1=employee1()
        Employee1.Date=row['Date']
        Employee1.Name=row['Name']
        Employee1.Number=row['Number']
        Employee1.Time_IN=row['Time IN']
        Employee1.Time_OUT=row['Time OUT']
        Employee1.save()

所以请在我的 METHOD1 中提供帮助,建议一些代码可以将 2 行合二为一,同时将数据传输到 sqlite

通过建议一些代码从 output.csv 导入数据来帮助 METHOD2

【问题讨论】:

  • @Ralf 你能帮我解决这个问题吗?

标签: django django-models django-forms django-templates django-views


【解决方案1】:

对方法 1 的建议

如果您的 CSV 文件中的行数不多(可能少于 10.000),那么您可以使用 python dict 按员工编号和日期进行分组。

我修改了你的一小部分代码:

... some code ...

record_dict = {}

for row in data:
    if row[0] == '':
        break

    record_date = row[0]
    emp_number = row[2]
    key = (emp_number, record_date)

    if key not in record_dict:
        record_dict[key] = employee1()
        record_dict[key].Date = row[0]
        record_dict[key].Name = row[1]
        record_dict[key].Number = row[2]
        record_dict[key].Time_IN = None
        record_dict[key].Time_OUT = None

    if row[3] not in ('', 'Time IN'):
        record_dict[key].Time_IN = row[3]
    if row[4] not in ('', 'Time OUT'):
        record_dict[key].Time_OUT = row[4]

for emp in record_dict.values():
    emp.save()

顺便说一句:你应该阅读PEP8,这是 python 编码风格指南,展示了编写 python 代码的首选方式。

【讨论】:

  • 您提供的代码与我的方法 1 所做的工作相同,timein & timeout 在单独的行中
  • 当我在 Excel 表中向 RFID 传感器显示卡时,时间被记录到系统时间,超时留空。当我再次向传感器显示卡片时,为同一张卡片制作了新条目,其中 timein 为空白并记录了超时
  • 当我将 csv 文件数据导入到 sqlite 时,我希望我的数据库中只有一个条目,而不是一个用于 timein 的条目和另一个用于超时的条目
  • 我的代码遍历 CSV 中的所有行,并检查 emp_number 和日期的记录是否已存在于 record_dict 中;如果它存在(意味着该日期和员工已经存在一行),我的代码会将新信息(超时或时间)添加到同一条记录中。
猜你喜欢
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多