【问题标题】:Reading a dataframe from an odc file created through excel using pandas从使用 pandas 的 excel 创建的 odc 文件中读取数据框
【发布时间】:2019-11-18 00:20:37
【问题描述】:

我的公司已经通过 SQL 完成了一些工作,并允许我们通过从 Excel 请求 SQL 源来访问某些数据帧。 所以我从数据>其他来源>请求了电子表格并创建了这个.odc文件(一种数据连接),它允许我读取那个特定的数据框 所以我想使用 pandas 读取数据框,但不知道该怎么做

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

我考虑过使用以下内容:

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

有没有办法直接读取.odc 文件并从连接文件中获取我想要的数据帧?

欢迎提出建议

【问题讨论】:

    标签: python sql database pandas


    【解决方案1】:

    只有 MS Office 应用程序可以直接使用 .odc 文件,这些文件只是元数据信息文件,而不是实际的连接对象或 API。但是,您可以提取基础信息,特别是连接字符串,以便在 MS Office 应用程序之外使用。

    由于 Office 数据连接 (.odc) 文件是 HTML/XML 标记文件,因此请在任何文本编辑器中打开它们并找到 <odc:ConnectionString> 标记。然后,直接在 Python 脚本中使用该值。但是,连接可能会使用未与 PostgreSQL 的 SQLAlchemy 集成的 OLEDB 提供程序或 ODBC 驱动程序,但您可以提取所需的参数:hostuser数据库等,以满足您的需求。否则使用 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      相关资源
      最近更新 更多