Как мне получить значения из файла CSV для загрузки в базу данных SQL с помощью Python? - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь выяснить, как загрузить мои данные из файла 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;

Первая строка - это заголовок со значениями столбца. После этого следуют «реальные» данные, которые должны быть вставлены в эти столбцы. Я также уже создал базу данных, таблицу и столбцы. Я думаю, что данные не могут загружаться из-за точек с запятой между значениями в разных столбцах. Я уже заменил их на ",", но в конце точка с запятой отсутствует, чтобы закончить строку. Я надеюсь получить какие-либо советы в ближайшее время. Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Модуль 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()
0 голосов
/ 05 июля 2018

Использование 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, имя, 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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...