如何使用Python跳过SQLite中的列?

时间:2012-02-02 21:39:39

标签: python sqlite

我是python的新手,我有一个基本的python脚本,我需要使用Python将CSV文件中的值插入到SQLite数据库中。我已成功完成该部分,但是,我不需要包含第29列中的第26,27和28列。每当我尝试执行此操作时,它只会跳过整行,但我只希望它跳过该特定列一般来说。我最初在创建表时尝试不包括列,但每次运行脚本时都会出错

这是我正在处理的有关此过程的代码:

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 个答案:

答案 0 :(得分:2)

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 :(得分:1)

您正在迭代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

答案 2 :(得分:1)

如果我没记错的话,csv.reader会返回行而不是列。

无论如何,快速而肮脏的方式(可能效率低下)就是使用内置的pop函数。这应该从返回的列表中删除项目。 为了简单起见,请按相反顺序执行弹出(首先是最高数组索引),否则当数组变小并且元素位置移动时,它会变得混乱

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

cu.execute(sql_insert, line)