使用熊猫从通过excel创建的odc文件中读取数据帧

时间:2019-07-08 13:11:45

标签: python sql database pandas

我的公司已经通过SQL完成了一些工作,并允许我们通过从Excel请求SQL源来访问某些数据框。 因此,我已经从data> other source>请求电子表格,并创建了这个.odc文件(一种数据连接),该文件可让我读取该特定数据框 所以我想用熊猫读取数据框,但不确定如何做

我考虑过使用sqlalchemy导入来创建引擎 但是事实是,IT同事是完成所有SQL工作的人,我只需要读取文件,所以不确定是否是解决方案。

我考虑过使用以下内容:

from sqlalchemy import create_engine
engine = create_engine('postgresql://user@localhost:5432/mydb')

是否可以直接读取.odc文件并从连接文件中获取所需的数据框?

欢迎任何建议

1 个答案:

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