我刚刚开始使用Python,并且正在使用以下代码将CSV文件导入到sqlite3表中,我自愿承认我已经从互联网上复制了大部分内容:
with open(getPathTo('my.csv'), 'r') as csvfile:
reader = csv.DictReader(csvfile)
records = [(row['SEGMENT'], row['Comp 1'], row['Comp 2']) for row in reader]
c.executemany("INSERT INTO comparison (`SEGMENT`, `Comp 1`, `Comp 2`) VALUES (?,?,?);", records)
conn.commit()
它工作正常,但我在很多文件和表格中重复这个,我想把它变成一个函数。我的目标是:
def importCSVToTable(file, table, columns)
但是,鉴于columns
的列表,我如何在这一行中使用它:
records = [(row['SEGMENT'], row['Comp 1'], row['Comp 2']) for row in reader]
我觉得我的语法略有不同。
答案 0 :(得分:2)
这里有一些示例代码,显示了可能有用的内容。我们使用带有过滤if
语句的嵌套理解来确保我们不会尝试访问不存在的dict项。
In [3]: def importCSVtoTable(file, table, columns):
...: # 'mock' data to simulate a reader
...: reader = [{'SEGMENT': 2, 'Comp 1': 'dogs'}, {'Comp 2': 'cats', 'OTHERTHING': 4}
...: print [[row[label] for label in columns if label in row] for row in reader]
...:
In [4]: importCSVtoTable(None, None, ['SEGMENT', 'Comp 1'])
[[2, 'dogs'], []]
In [5]: importCSVtoTable(None, None, ['SEGMENT', 'Comp 1', 'Comp 2'])
[[2, 'dogs'], ['cats']]
答案 1 :(得分:1)
所以我认为你问的是,给定一个键(列)列表,如何从字典中提取它们?我们只使用内存中的CSV文件来测试它:
>>> example_data = """col1,col2,col3\na1,a2,a3\nb1,b2,b3\nc1,c2c3"""
>>> print example_data
col1,col2,col
a1,a2,a3
b1,b2,b3
c1,c2c3
然后,如果我们有一个基于它的csvreader:
>>> import csv, StringIO
>>> reader = csv.DictReader(StringIO.StringIO(example_data))
>>> print reader.fieldnames
['col1', 'col2', 'col3']
因此,如果我们想根据该字段列表进行迭代:
>>> for row in reader:
... print 'insert into mytable (%s) values (%s)' % (','.join(reader.fieldnames), ','.join(['?']*len(reader.fieldnames)))
insert into mytable (col1,col2,col3) values (?,?,?)
insert into mytable (col1,col2,col3) values (?,?,?)
insert into mytable (col1,col2,col3) values (?,?,?)
从那里,显然,你会想要适应你的功能。但这会回答你关于csvreader的机制和操纵Python列表的问题吗?
(注意,这适用于Python 2。)
答案 2 :(得分:0)
也许是这样的?当然没有经过考验。
def importCSVToTable(conn, filename, table, columns)
with open(getPathTo(filename), 'r') as csvfile:
reader = csv.DictReader(csvfile)
records = []
for row in reader:
for col in columns:
records.append(row[col])
conn.executemany("INSERT INTO comparison (" + ','.join(columns) + ") VALUES ("+ ','.join(["?"]*columns.length) +");", records)
conn.commit()
答案 3 :(得分:-2)
在函数中获取列列表,然后对列表中的每个元素查找row[list-element]
并附加到列表中以进行记录。