Python: как передать функцию list в качестве параметра? [дубликат]



На этот вопрос уже есть ответ здесь:



Я только начинаю с 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]


Я просто немного сбит с толку синтаксисом, я думаю.

551   4  

4 ответов:

Вот пример кода, показывающий что-то, что может быть полезно. Мы используем вложенное понимание с оператором filtering 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']]

Итак, я думаю, что вы спрашиваете, как извлечь их из словаря, имея список ключей (столбцов)? Давайте просто используем 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.)

Может быть, что-то вроде этого? непроверенные, конечно.

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

В функции получить список столбцов , а затем для каждого элемента в списке найти row[list-element] и добавить к списку для записи.

Comments

    Ничего не найдено.