从csv文件读取以循环并插入mysql数据库

时间:2019-06-04 09:13:58

标签: django python-3.x

我正在开发一个可以向客户发送个性化消息的系统。我有一个包含联系人和姓名的文件。我要上传文件,然后阅读文件。在插入数据库之前,我想从html模板的文本框中向其中添加一条消息。例如,我会说:亲爱的[name],谢谢。它将遍历excel文件并将联系人和已生成的消息(如Dear Ronald)插入数据库,谢谢。

我设法添加以上传excel文件并将联系人插入数据库表中。但是我无法连接到文本框消息

Views.py
 def upload(request):
    template = 'sms/upload.html'
    prompt = {'order':'order of the CSV should be'}
    context = {}
    list1 =[]

    if request.method =="GET":
        return render(request, template, prompt)
    csv_file = request.FILES['file']
    if not csv_file.name.endswith('.csv'):
        messages.error(request,'This is not a csv file')
    data_set = csv_file.read().decode('UTF-8')
    io_string = io.StringIO(data_set)
    # row = csv.reader(io_string, delimiter=',', quotechar="|")
    # next(io_string)

    for column in csv.reader(io_string, delimiter=',', 
quotechar="|"):
        s = ''.join(column[0].split())
        p=f"{254}{s[-9:]}"

        _, created = Contact.objects.update_or_create(
            phone_numbers = p,
            first_name=column[1],
            last_name=column[2],
            email=column[3],
            author=request.user



        )

    context = {}
    # context1 = {list1}
    # print (context1)
    # print(column)


    return render(request, template, context)

#upload.html

 {% extends 'sms/base.html'%}

 {% block content%}




 {% if messages %}
   {% for message in messages %}

     <div class="">

      <strong>{{message|safe}}</strong>


     </div>

   {% endfor %}

 {%else%}
 <!-- {{order}} -->
 <form  method="post" enctype="multipart/form-data">
   {% csrf_token %}
   <!-- <label>Upload file</label> -->
   <input type="file" name="file">
  <p>Only accepts CSV file</p>
  <button type="submit">Upload</button>


</form>



 {% endif %}




<div class="col-sm-10">
  <h4>Send  message </h4>
  <div class="col-md-12">
   <form class="form-group" action="" method="POST">
   {% csrf_token %}

    Message: <br/>
    <textarea name="text_message" id="phone" class="form-control" 
 cols="14" rows="6" placeholder="Type your message here"> 

  <br/>


<br>
<input class="btn btn-secondary" type="submit" value="Send Now"/>
</form>

{%endblock content%}

我想将保存的字段另存为变量,并传递给upload.html模板,然后处理将消息插入数据库中

1 个答案:

答案 0 :(得分:0)

要插入数据,首先必须正确读取数据。如果您在词典列表 [{'name':'abc','contact':123},{'name':'xyz', 'contact':456}]中读取csv数据,则迭代将很容易。     熊猫是处理数据的最佳库。 您可以使用此代码获取字典的列表

get_file = request.FILES['files']
df = pd.read_csv(get_file)
df = df.where((pd.notnull(df)), '')
    row = df.shape[0]
    col = df.shape[1]
    lista = [] 
    for r in range(row):
        aDict = {} 
        for c in range(col):
            v = df.iat[r,c]
            k = df.columns[c]
            aDict[k]=v
        lista.append(aDict)

此处lista返回字典列表 列表中的每个字典代表(csv,excel)的行。然后,您可以通过列名lis['name']轻松地将此数据保存在DB中 在您可以传递上下文之后。

注意:您需要通过

安装熊猫
pip install pandas