Python:如何将列表作为参数传递给函数?

时间:2016-04-22 16:35:52

标签: python csv

我刚刚开始使用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]

我觉得我的语法略有不同。

4 个答案:

答案 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]并附加到列表中以进行记录。