我的公司已经通过SQL完成了一些工作,并允许我们通过从Excel请求SQL源来访问某些数据框。
因此,我已经从data> other source>请求电子表格,并创建了这个.odc
文件(一种数据连接),该文件可让我读取该特定数据框
所以我想用熊猫读取数据框,但不确定如何做
我考虑过使用sqlalchemy导入来创建引擎 但是事实是,IT同事是完成所有SQL工作的人,我只需要读取文件,所以不确定是否是解决方案。
我考虑过使用以下内容:
from sqlalchemy import create_engine
engine = create_engine('postgresql://user@localhost:5432/mydb')
是否可以直接读取.odc
文件并从连接文件中获取所需的数据框?
欢迎任何建议
答案 0 :(得分:0)
仅MS Office应用程序可以直接使用.odc文件,这些文件只是元数据信息文件,而不是实际的连接对象或API。但是,您可以提取基础信息,特别是连接字符串,以在MS Office应用程序之外使用。
由于Office数据连接(.odc)文件是HTML / XML标记文件,因此请在任何文本编辑器中将其打开,然后找到<odc:ConnectionString>
标记。然后,直接在Python脚本中使用此值。但是,很可能该连接将使用未与PostgreSQL的SQLAlchemy集成的OLEDB提供程序或ODBC驱动程序,但您可以提取所需的参数: host , user , 数据库等满足您的需求。否则,请使用Postgres的ODBC驱动程序查看pyodbc
(无SQLAlchemy)。
下面显示了到MS Access数据库的.odc文件示例以及Python中使用的相同连接字符串(不带SQLAlchemy)。
.odc
<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/x-ms-odc; charset=utf-8">
<meta name=ProgId content=ODC.Table>
<meta name=SourceType content=ODBC>
<title>My Access DB</title>
<xml id=docprops>
<o:DocumentProperties xmlns:o="urn:schemas-microsoft-com:office:office" xmlns="http://www.w3.org/TR/REC-html40">
<o:Description>My MS Access DB</o:Description>
<o:Name>My MS Access DB</o:Name>
</o:DocumentProperties>
</xml>
<xml id=msodc>
<odc:OfficeDataConnection xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns="http://www.w3.org/TR/REC-html40">
<odc:Connection odc:Type="ODBC">
<odc:ConnectionString>DSN=MS Access Database;DBQ=C:\Path\To\MyDatabase\DB.accdb;DefaultDir=C:\Path\To\MyDatabase;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;</odc:ConnectionString>
<odc:CommandText>SELECT * FROM `C:\Path\To\MyDatabase\DB.accdb`.`MyTable`</odc:CommandText>
</odc:Connection>
</odc:OfficeDataConnection>
</xml>
<style>
<!-- .ODCDataSource {
behavior: url(dataconn.htc);
}
-->
</style>
</head>
...
Python (注意,上面使用的是确切的连接字符串)
import pyodbc
import pandas as pd
conn = pyodbc.connect('DSN=MS Access Database;DBQ=C:\Path\To\MyDatabase\DB.accdb;'
'DefaultDir=C:\Path\To\MyDatabase;DriverId=25;FIL=MS Access;'
'MaxBufferSize=2048;PageTimeout=5;')
df = pd.read_sql("SELECT * FROM myTable", conn)
...
conn.close()