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

Python:如何将列表作为参数传递给函数?,python,csv,Python,Csv,我刚刚开始使用Python,正在使用以下代码将CSV文件导入到sqlite3表中,我承认我已经从internet复制了大部分CSV文件: 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("INSE

我刚刚开始使用Python,正在使用以下代码将CSV文件导入到sqlite3表中,我承认我已经从internet复制了大部分CSV文件:

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)
但是,给定一个
列的列表
,我如何在这行中使用它:

records = [(row['SEGMENT'], row['Comp 1'], row['Comp 2']) for row in reader]

我想,我只是有点被语法搞糊涂了。

在函数中,获取列列表,然后为列表中的每个元素找到
行[list element]
,并将其附加到列表中以用于记录。

下面是一些示例代码,展示了一些可能有用的内容。我们使用一个带有过滤
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']]

也许是这样的?当然没有经过测试

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()

所以我想你要问的是,给定一个键(列)列表,我如何从字典中提取它们?让我们使用内存中的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的。)

列的数量及其名称是否在表与表之间发生变化?是。不同的表,不同的模式。您考虑过
sqlalchemy
ORM吗?谢谢,还没有。对于一个快速的python脚本来批处理一些CSV文件来说,ORM似乎有点过火了,但如果没有其他办法,我就试试看。谢谢。这是所有的专栏;他似乎希望能够选择从CSV中提取哪些列。不,我认为他希望提取所有列。不,我希望选择提取哪些列,正如我将传递到函数中的
列表中指定的那样。我正在努力解决的是如何将列列表传递到填充
记录的行中
variable@Wintermute然后只需将列名作为列表传递,如
['a','b','c']
,在函数中,如我所说,使用a for each来查找
行[列表元素]
。为什么会有否决票@A P为我的解释提供了代码。这正是我在回答中解释的+1这正是我想要的,谢谢!是的,那就行了,但我想有一种方法可以在一行上完成所有的事情,上面的答案就是这么做的。但我觉得,尽管可能很像蟒蛇,但将如此多的信息和控制流塞进一行并不是很容易维护的。但对每个人来说,我想这并不完全是我想要的——我想看看我是否可以修改我现有代码中的一行来处理列表——但它确实有用,谢谢。