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

标签 python pyodbc xlrd

我正在尝试使用 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] 确实返回了我想为每一列插入到表中的正确数据,但执行语句无法识别它。

最佳答案

如果您不处理大型 Excel 工作表或任何有问题的数据类型(例如 Dates in Excel spreadsheets 部分中描述的数据类型),您可以简化将所有行读取到一个列表中的过程,弹出插入的标题值列,然后调用 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()

关于python - 在 Python 2.7 中为列表中的变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27713919/

相关文章:

python - pyodbc - 无法连接到 DSN

python - 在pyodbc中执行SELECT查询时,ODBC MS Access驱动程序出现“超出系统资源”错误

python - 像 openpyxl 或 xlrd/xlwt 这样的第三方库有什么,win32com 没有什么?

python xlrd - 从工作表中检索列索引

python - 如何在不使用 MacPorts 或 Fink 的情况下在 OS X Leopard 上安装 lxml?

python - 数据帧中的矢量化标志分配

python - 从 Pandas 数据框中删除字典引用

python - 格式化字符串刻度标签 matplotlib

python - 如何使 pyodbc 输出更具可读性/更好?

python-3.x - 如何用python 3打开xlsx文件