Как пропустить столбцы в SQLite с помощью Python? - PullRequest
0 голосов
/ 03 февраля 2012

Я очень плохо знаком с Python и у меня есть базовый скрипт на Python, где мне нужно вставить значения из CSV-файла в базу данных SQLite с использованием Python.Я выполнил эту часть успешно, однако мне не нужно включать столбцы 26, 27 и 28 из 29. Всякий раз, когда я пытаюсь сделать это, он просто пропускает всю строку, однако я хочу, чтобы он пропускал этот конкретный столбец.в общем.Я пытался не включать столбцы при создании таблицы изначально, однако я получал ошибку каждый раз, когда я запускал скрипт

Это код, с которым я работаю в отношении этого процесса:

import sys, sqlite, csv

  try: 
    cx = sqlite.connect("database")

except sqlite.Error, errmsg:
    print "Could not open the database file: " + str(errmsg)
    sys.exit()

#create the table        
try:
    cu = cx.cursor()
    cu.execute('DROP TABLE IF EXISTS table_name')

    sql = """ CREATE TABLE table_name(col1 TEXT, col2 TEXT, col3 TEXT, col4 TEXT, col5 TEXT, col6 TEXT, col7 TEXT, col8 TEXT, col9 TEXT, col10 TEXT, col11 TEXT, col12 TEXT, col13 TEXT, col14 TEXT, col15 TEXT, col16 TEXT, col17 TEXT, col18 TEXT, col19 TEXT, col20 TEXT, col21 TEXT, col22 TEXT, col23 TEXT, col24 TEXT, col25 TEXT, col26 TEXT, col27 TEXT, col28 TEXT, col29 TEXT); """

    cu.execute(sql)
    cx.commit()
except sqlite.Error, errmsg:
    print "Could not execute the query: " + str(errmsg)
    sys.exit()

#Load the CSV file into the csv reader


fin = open("test.csv", "rb")
creader = csv.reader(fin, delimiter=',')

# Interate through the CSV Reader, inserting each value into the database
    # NEW REVISION
  sql_insert = "INSERT INTO table_name VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,,,,%s);"    


      for row in creader:
         cu.execute(sql_insert, row)
         print row

fin.close()
cx.commit()
cx.close()

Ответы [ 3 ]

2 голосов
/ 03 февраля 2012

Способ работы csv.reader() состоит в том, что он возвращает списки, каждый из которых представляет строку .Поэтому, если у вас есть CSV-файл, который выглядит следующим образом:

col1, col2, col3, col4
a, b, c, d
e, f, g, h
i, j, k, l

Соответствующее содержимое csv.reader() выглядит следующим образом:

>>> with open('blah.csv', 'rb') as csv_file:
...     cr = csv.reader(csv_file)
...     for row in cr:
...         print row
... 
['col1', ' col2', ' col3', ' col4']
['a', ' b', ' c', ' d']
['e', ' f', ' g', ' h']
['i', ' j', ' k', ' l']

Что хорошо в списках, так это то, что вы можете нарезать ихих.

>>> with open('blah.csv', 'rb') as csv_file:
...     cr = csv.reader(csv_file)
...     for row in cr:
...         print row[0:3]
... 
['col1', ' col2', ' col3']
['a', ' b', ' c']
['e', ' f', ' g']
['i', ' j', ' k']

Это наиболее очевидный способ пропустить последние несколько столбцов таблицы CSV.Вы также можете объединить фрагменты списков:

>>> with open('blah.csv', 'rb') as csv_file:
...     cr = csv.reader(csv_file)
...     for row in cr:
...         print row[0:2] + row[3:]
... 
['col1', ' col2', ' col4']
['a', ' b', ' d']
['e', ' f', ' h']
['i', ' j', ' l']

Соберите все вместе:

>>> with open('blah.csv', 'rb') as csv_file:
...     sql_insert = 'INSERT INTO table_name VALUES(?, ?, ?)'
...     for row in csv.reader(csv_file):
...         cu.execute(sql_insert, row[0:2] + row[3:])
... 
<sqlite3.Cursor object at 0x100535298>
<sqlite3.Cursor object at 0x100535298>
<sqlite3.Cursor object at 0x100535298>
<sqlite3.Cursor object at 0x100535298>
>>> cu.execute('SELECT * FROM table_name').fetchall()
[(u'col1', u' col2', u' col4'), (u'a', u' b', u' d'), (u'e', u' f', u' h'), (u'i', u' j', u' l')]
1 голос
/ 03 февраля 2012

Если я правильно помню, csv.reader возвращает строки, а не столбцы.

В любом случае, быстрым и грязным способом (возможно, неэффективным) было бы использовать встроенную функцию pop. Это должно удалить элементы из возвращенного списка. Для простоты выполните всплывающее окно в обратном порядке (сначала указывается самый высокий индекс массива), иначе это может привести к путанице, поскольку массив становится меньше и позиции элементов перемещаются

for line in creader:
   line.pop(28)
   line.pop(27)
   line.pop(26)

cu.execute(sql_insert, line)
1 голос
/ 03 февраля 2012

Вы перебираете вывод csv.reader (), как если бы они были столбцами. Это неверно. Они на самом деле целые ряды. Это должно быть больше похоже на:

for row in reader:
    # Now to skip the mentioned columns just don't use those in your sql insert statement
    # for example column 25 is row[24]
    # Instead, put a blank in your SQL
    row[25]=""
    row[26]=""
    row[27]=""

    sql_insert = "INSERT INTO table_name   VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"  
    cursor.execute(sql_insert , row)

вставить вместо% s для этих столбцов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...