在Python 2.7中为列表中的变量赋值

炮弹

我正在尝试使用pyodbc将相当数量(约30万行)的数据上传到数据库。由于数据需要每季度更新一次(从电子表格中),因此我试图创建的是一种动态插入语句,以使事情更加简化。我的思考过程是,我可以将电子表格中各列的标题命名为与要上传相应数据的表中的列相同的名称。

我试图做的是编写一个脚本,该脚本提取工作表标题行中的列名并将其用作变量,从而避免了如果我要从不同的excel上载不同的数据时更改任何代码的需求纸背对背:

import xlrd
import numpy as np
import pyodbc


wb=xlrd.open_workbook(r"FILE")
worksheet = wb.sheet_by_name('SHEET_NAME')

num_rows = worksheet.nrows
num_cols = worksheet.ncols 
header_row = 0
header_list = [worksheet.row_values(header_row)]
header_values = ", ".join([str(i) for i in [cell.value for cell in worksheet.row(header_row)]])
question_marks = ",?" * (num_cols - 1) 
cell=worksheet.cell(1,1)

arr = []

for rowind in range(num_rows)[(header_row + 1):]:
    arr.append([cell.value for cell in worksheet.row(rowind)])

data = np.rec.fromrecords(arr, names=header_values)

cnxn = pyodbc.connect(r"DRIVER={SQL Server};SERVER=XXXXXXXXXX
\DEV_CON1;DATABASE=GGG;UID=AAA_dbo;PWD=XXXXXXXXX;")
cursor = cnxn.cursor()



populate_db = "insert into tblSnap_TEST(" + header_values + ") values (?" + question_marks + ")"

for i in header_list: 
    i = data[i]

values = header_list 

cursor.execute(populate_db,values)

cursor.close
cnxn.commit
cnxn.close`

当我尝试运行脚本时,出现以下错误消息:

File "<ipython-input-45-6809dc4a27ac>", line 1, in <module>
runfile('H:/My Documents/Python/string_search_test.py', wdir='H:/My Documents/Python')

File "C:\Users\xxxx\xxx\xx\x\Anaconda\lib\site-                                                    packages\spyderlib\widgets\externalshell\sitecustomize.py", line 580, in runfile
execfile(filename, namespace)

File "H:/My Documents/Python/string_search_test.py", line 67, in <module>
cursor.execute(populate_db,values)

ProgrammingError: ('The SQL contains 21 parameter markers, but 1 parameters were supplied', 'HY000')

我之前完成此操作的方法是显式定义要传递的值,例如:

account_numbers = (sheet.cell(row_index, 1).value)

但是就像我说的那样,我在这里想要做的就是制作它,所以我不必键入它。那就是我试图对i = data [i]所做的事情。我希望Python有一种方法可以识别“ account_numbers”在列表中(从工作表的标题创建),然后根据与i = data[i]我上面尝试过的类似方法获取相应的数据这样的解决方案可行吗?data [i]确实为每个列返回了我想插入表中的正确数据,但是execute语句无法识别它。

布赖恩

如果您不处理大型Excel工作表或任何有问题的数据类型(例如Excel电子表格中的日期部分中描述的数据类型),则可以简化将所有行读取到一个列表中的操作,弹出插入列的标题值,然后一次调用Cursor.executemany插入电子表格中的所有值,并传递一系列参数值序列。

我删除了numpy数组填充,因为在提供的代码段中没有必要。

header_row = 0

# build list of lists that represents row values in worksheet,
# including column names from header row
rows = [worksheet.row_values(row) for row in range(worksheet.nrows)]

# extract list of column names to use for insert statement, values to be inserted remain
columns = rows.pop(header_row)

cnxn = pyodbc.connect(r"DRIVER={SQL Server};SERVER=XXXXXXXXXX\DEV_CON1;DATABASE=GGG;UID=AAA_dbo;PWD=XXXXXXXXX;")
cursor = cnxn.cursor()

# list of column names used to build SQL statement, including parameter placeholders (?)
populate_db = "insert into tblSnap_TEST ({}) values ({})".format(', '.join(columns),
                                                                 ', '.join('?' * len(columns)))

# insert is executed once for each sequence of parameter values
cursor.executemany(populate_db, rows)
cnxn.commit()
cnxn.close()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python 中的列表、变量赋值和函数

来自分类Dev

在 Python 中为变量赋值的问题

来自分类Dev

python列表中的无限赋值?

来自分类Dev

在python中为矩阵赋值

来自分类Dev

在 Python 中为矩阵赋值

来自分类Dev

使用for循环在python中的2个列表上迭代变量

来自分类Dev

使用for循环在python中的2个列表上迭代变量

来自分类Dev

Python:嵌套列表中以 2 为底的对数

来自分类Dev

在Python中为变量进行新赋值会更改该变量的旧地址吗?

来自分类Dev

为变量赋值并在python中的另一个变量中使用它

来自分类Dev

Python中的2变量For循环

来自分类Dev

元组匹配与Python中的变量赋值

来自分类Dev

python中的变量赋值和引用

来自分类Dev

为for循环python中的行赋值

来自分类Dev

我可以在python中同时进行变量赋值和列表插入吗?

来自分类Dev

Python中的变量列表

来自分类Dev

Python 2中的列表切片

来自分类Dev

使用python从单词列表中查找长度为2的单词的所有组合

来自分类Dev

Python 中这种类型的变量赋值是什么?

来自分类Dev

如何在python中为eval函数的输出赋值

来自分类Dev

为射箭目标python3中的戒指赋值

来自分类Dev

如何在python中为函数参数赋值

来自分类Dev

如果我在 python 中有 2 个变量的列表,如何根据列表中的出现对它们进行排序

来自分类Dev

python列表中变量的扩展

来自分类Dev

列表在python中为空白

来自分类Dev

从Python列表中获得2乘2的项

来自分类Dev

Python从2个元素列表中创建对象列表

来自分类Dev

从 Python 中的 2D 列表中获取列

来自分类Dev

在 Python 中连接列表中的 2 个项目