繁体   English   中英

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

[英]How do I get to my values from a CSV file to load into my SQL database with python?

我试图弄清楚如何将数据从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;

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

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

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)值(%s,%s,%s,%s,%s,%s,%s,%s )'

遍历值,

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

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM