如何从CSV文件获取值以使用python将其加载到SQL数据库中?

时间:2018-07-05 13:26:53

标签: python csv sqlite

我试图弄清楚如何将数据从CSV文件加载到SQL数据库中。

我目前使用Sqlite3,因为我还无法安装pymssql。到目前为止,这是我的代码:

import csv, sqlite3
con = sqlite3.connect("aerzte.db")
cur = con.cursor()
#cur.execute("""CREATE TABLE liste (id INTEGER PRIMARY KEY, Anrede TEXT,     Titel TEXT, Titel2 TEXT, Vorname TEXT, Name TEXT, Praxis TEXT, Straße TEXT, PLZ TEXT, Ort TEXT);""") 
with open('arztliste.csv', 'r') as f:
    file = csv.reader(f)
    columns = next(file)
    query = 'insert into liste({0}) values ({1})'
    query = query.format(','.join(columns), ','.join('?' * len(columns)))
    for data in file:        
        cur.execute(query, data)
    cur.commit()

con.commit()
con.close()

我的CSV文件如下:

Anrede;Titel;Titel2;Vorname;Name;Praxis;Straße;PLZ;Ort;
Herr;Dr.;med.;Norbert;Braunisch;CoMedicum Landshuter Allee GmbH; Landshuter Allee 45;80637;München;

第一行是带有列值的Header。之后,应该插入这些列的“真实”数据。我也很容易创建数据库,表和列。 我认为由于不同列值之间的分号而无法加载数据。我已经用“,”代替了它们,但是最后缺少分号来结束这一行。 我希望尽快得到任何建议。 谢谢。

2 个答案:

答案 0 :(得分:1)

使用csv.DictReader使得工作比阅读器更简单,并且我将其从分号更改为逗号,以防万一您要使用分号,请在阅读器对象中指定分隔符

with open('arztliste.csv', 'r') as f:
    file = csv.Dicteader(f)
    csv_data = []
    for element in file : 
         csv_data.append(element)

csv_data现在包含字典列表,其中键是csv文件的标题,而值是“实际”数据。

一旦获得正确的数据,就很容易将其转储到sqldb中,

  

query ='INSERT INTO   table_name(Anrede,Titel,Titel2,Vorname,Name,Praxis,Straße,PLZ,Ort)   VALUES(%s,%s,%s,%s,%s,%s,%s,%s)'

浏览值

for data in csv_data:
     cur.execute(query,data['Anrede'],data['Titel'],data['Titel2']...data['Ort'])

答案 1 :(得分:1)

Python csv模块允许您声明定界符。而且,由于在行尾添加了其他分号,因此您将在每一行中获得一个必须忽略的附加字段。

提交游标没有意义:您只能在连接级别进行提交。您必须选择是否要在每行(不常见)之后,第n行的文件末尾(可能使用内存)提交(使用计数器)。因此,您的代码应成为(使用最后一个选项)

...
counter = 20                                            # commit every 20-th row
with open('arztliste.csv', 'r') as f:
    file = csv.reader(f, delimiter=";")                 # declare delimiter
    columns = next(file)[:-1]                           # ignore last (empty) field
    query = 'insert into liste({0}) values ({1})'
    query = query.format(','.join(columns), ','.join('?' * len(columns)))
    for data in file:        
        cur.execute(query, data[:-1])                   # ignore last (empty) field
        counter -= 1
        if counter == 0:
            con.commit()
            counter = 20

con.commit()
con.close()