首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从python大熊猫数据框架导出或写入数据到MS访问表

从python大熊猫数据框架导出或写入数据到MS访问表
EN

Stack Overflow用户
提问于 2017-10-16 10:00:47
回答 3查看 10K关注 0票数 2

我正在尝试将数据从python熊猫数据框架导出到现有的MS访问表中,我想用我尝试使用的pandas.to_sql更新的数据(在python中)替换MS访问表,但是我得到了一个错误消息。我觉得这很奇怪,使用pandas.read_sql可以无缝地工作吗?

这是我的代码:

代码语言:javascript
复制
import pyodbc
import pandas as pd
conn_str = (
r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=H:\Work\IndexTrader\Data\database\IndexData.accdb;'
)
cnxn = pyodbc.connect(conn_str)
SQL = 'SELECT * FROM Index_data;

从MS读取数据很好,见下文

代码语言:javascript
复制
dfins = pd.read_sql(SQL, cnxn)

然而,当我试图回写并替换MS过剩的表时,它不起作用吗?

代码语言:javascript
复制
dfins.to_sql('Index_data', cnxn, if_exists='replace')
cnxn.close()

我得到的错误是:

代码语言:javascript
复制
DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ('42S02', "[42S02] [Microsoft][ODBC Microsoft Access Driver] The Microsoft Access database engine cannot find the input table or query 'sqlite_master'. Make sure it exists and that its name is spelled correctly. (-1305) (SQLExecDirectW)")

如果有替代pandas.to_sql的方法,这也会有帮助,我只需要知道如何导出我的数据。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-16 12:31:27

正如评论中所说的,to_sql只支持sqlite3

一个示例方法可以逐行解析数据帧,并将每一行插入一个表中:

代码语言:javascript
复制
import pyodbc
import pandas as pd
conn_str = (
r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=C:\Users\Erik\Desktop\TestDb.accdb;'
)
cnxn = pyodbc.connect(conn_str)
SQL = 'SELECT * FROM Index_data;'
dfins = pd.read_sql(SQL, cnxn)
for index, row in dfins.iterrows():
    with cnxn.cursor() as crsr:
       crsr.execute("INSERT INTO Output(Field1, Field2) VALUES(?,?)", row["F1"], row["F2"] ) 

这会将F1F2列DataFrame插入到名为Output的表的字段Field1Field2中。

这有两个主要条件可以正常工作:

  1. 您需要有一个Access表来接收数据。
  2. 该表需要有正确的字段和正确的数据类型来接收数据。

您可以使用预先存在的表,比如从索引表中获取数据,尽管我不建议使用它(可能会丢失数据)。如果这样做,您需要首先清除表。要清除索引表,请执行以下操作:

代码语言:javascript
复制
with cnxn.cursor() as crsr:
    crsr.execute("DELETE * FROM Index_data;")
票数 7
EN

Stack Overflow用户

发布于 2017-10-16 17:57:17

考虑将熊猫数据导出到CSV文件,然后运行中的内联查询,因为Jet/ACE SQL引擎允许直接查询CSV。请注意,文件夹是文件名上带有句点限定符的数据库。相应地调整列。

代码语言:javascript
复制
import pyodbc
import pandas as pd

conn_str = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=H:\Work\IndexTrader\Data\database\IndexData.accdb;'
cnxn = pyodbc.connect(conn_str)

...

dfins.to_csv(r'C:\Path\To\myCSVFile.csv', index=False)

cur = cnxn.cursor()
cur.execute("INSERT INTO Index_data (Col1, Col2, Col3)" + \
            " SELECT Col1, Col2, Col3" + \
            " FROM [text;HDR=Yes;FMT=Delimited(,);Database=C:\Path\To\Folder].myCSVFile.csv t")
cnxn.commit()
票数 5
EN

Stack Overflow用户

发布于 2021-03-06 04:08:34

只是为了跟进帕法特的回答。我喜欢在ms access中使用内联查询的想法,而不是在dataframe中迭代行。但是,我遇到了一个问题,就是那些看上去是数字的字段(在Excel或Access中);那些字段的前导为零。在我的环境里有很多这样的东西。对于这些,我只是使用csv模块用引号对它们进行包装。就像这样:

代码语言:javascript
复制
from pathlib import Path
import csv
csv_file = Path(Path.cwd(), ms_access_table_name + '.csv')
my_df.to_csv(csv_file, sep = ',', quoting=csv.QUOTE_NONNUMERIC , index=False)
ms_sql = f'INSERT INTO {ms_access_table_name} ({ms_access_columns}) \n' +\
            f'SELECT {ms_access_columns} \n' + \
            f'FROM [text;HDR=Yes;FMT=Delimited(,);IMEX=2;Database={Path.cwd()}].{ms_access_table_name + ".csv"}'
cursor.execute(ms_sql)
cursor.commit()

cursor.close()
conn.close()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46767614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档