[英]Unable to insert rows of a CSV file into a MYSQL database through python
[英]Insert into MySQl database after reading csv file?
我有这样的csv文件:
nohaelprince@uwaterloo.ca, 01-05-2014
nohaelprince@uwaterloo.ca, 01-05-2014
nohaelprince@uwaterloo.ca, 01-05-2014
nohaelprince@gmail.com, 01-05-2014
我需要阅读上面的csv文件并提取域名,还需要按域名和日期提取电子邮件地址的数量。 所有这些事情我都需要插入MySQL数据库中,但是以某种方式,我在迭代得到的列表后仍然无法插入MySQL数据库中。
查询将是这样的:
INSERT INTO domains(domain_name, cnt, date_of_entry) VALUES (%s, %s, %s);
下面是代码
#!/usr/bin/python
import fileinput
import csv
import os
import sys
import MySQLdb
from collections import defaultdict
lst = defaultdict(list)
d_lst = defaultdict(list)
# ======================== Defined Functions ======================
def get_file_path(filename):
currentdirpath = os.getcwd()
# get current working directory path
filepath = os.path.join(currentdirpath, filename)
return filepath
# ===========================================================
def read_CSV(filepath):
domain_list = []
domain_date_list = []
sorted_domain_list_bydate = defaultdict(list)
with open(filepath, 'rb') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
# insert the 1st & 2nd column of the CSV file into a set called input_list
email = row[0].strip().lower()
date = row[1].strip()
domain_date_list.append([date, email[ email.find("@") : ]])
domain_list.append(email[ email.find("@") : ])
for k, v in domain_date_list:
sorted_domain_list_bydate[k].append(v)
# remove duplicates from domain list
domain_list = list(set(domain_list))
return sorted_domain_list_bydate, domain_list
# ===========================================================
def update_DB(lst):
# open a database connection
db = MySQLdb.connect(host="localhost", # your host, usually localhost
user="root", # your username
passwd="abcdef1234", # your password
db="test") # name of the data base
cur = db.cursor()
a = []
for k, v in lst.items():
# now what should I do here?
# this is what I am confuse
db.commit()
db.close()
# ==========================================================
# ======================= main program =======================================
path = get_file_path('emails.csv')
[lst, d_lst] = read_CSV(path) # read the input file
update_DB(lst) # insert data into domains table
我对update_DB
方法感到困惑。
我不确定为什么您要为一个简单的任务准备这么复杂的程序。 让我们从顶部开始:
您需要首先按域,日期和计数正确地组织数据。
import csv from collections import defuaultdict, Counter domain_counts = defaultdict(Counter) with open('somefile.csv') as f: reader = csv.reader(f) for row in reader: domain_counts[row[0].split('@')[1].strip()][row[1]] += 1
接下来,您需要在数据库中正确插入每一行 :
db = MySQLdb.connect(...) cur = db.cursor() q = 'INSERT INTO domains(domain_name, cnt, date_of_entry) VALUES(%s, %s, %s)' for domain, data in domain_counts.iteritems(): for email_date, email_count in data.iteritems(): cur.execute(q, (domain, email_count, email_date)) db.commit()
由于您的日期未正确插入,因此请尝试使用此更新的查询:
q = """INSERT INTO
domains(domain_name, cnt, date_of_entry)
VALUES(%s, %s, STR_TO_DATE(%s, '%d-%m-%Y'))"""
这里的read_csv函数将返回sorteddomainlistbydate和update_db函数使用的domain_list(这是一个列表),您将在其中进行插入。
您的列表仅包含域名,而每对键值应包含的域名和数量如
google.com,2
live.com,1
for k, v in lst.items():
cur.execute("INSERT INTO domains(domain_name, cnt, date_of_entry) VALUES ('" + str(k) + "','" + str(v) + "','" + str(time.strftime("%d/%m/%Y"))+"')")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.