Чтение Zip-файла по URL-адресу и преобразование файла MS Access во фрейм данных - PullRequest
0 голосов
/ 13 июля 2020

Я пишу это сообщение, чтобы попросить помощи, чтобы найти решение для этого python кода. Я пытаюсь создать визуализацию деталей FAA PMA по сравнению с базой данных деталей моей компании. Я уже делал это с помощью файлов Power Bi, SQL Query и Excel, но это не онлайн-визуализация. Каждый месяц мне нужно загружать детали FAA PMA по URL-адресу (https://rgl.faa.gov/Regulatory_and_Guidance_Library/rgPMA.nsf/f6a80b2e3c91131686257bcf0063a042/bc1b3424cc899bee86257beb006237ae/ $ FILE / PMA.zip ), чтобы обновить эту визуализацию.

При этом я пытался выполните эти коды python, чтобы прочитать файл Ms Access из вышеупомянутого URL-адреса и преобразовать его в Pandas DataFrame.

Однако мне не удалось выполнить эту задачу по следующим причинам:

Сначала я попытался использовать sqlalchemy, но обнаружились следующие ошибки.

    from zipfile import ZipFile
    from io import BytesIO
    import urllib
    from urllib.request import urlopen
    from sqlalchemy import create_engine
    import pandas as pd
    
    r = urlopen("https://rgl.faa.gov/Regulatory_and_Guidance_Library/rgPMA.nsf/f6a80b2e3c91131686257bcf0063a042/bc1b3424cc899bee86257beb006237ae/$FILE/PMA.zip").read()
    file = ZipFile(BytesIO(r))
    pma_accdb = file.open("PMA.accdb")
    
    connection_string = (r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
                         r'DBQ=pma_accdb;'
                         r'ExtendedAnsiSQL=1;'
                                              )
    connection_url = f"access+pyodbc:///?odbc_connect={urllib.parse.quote_plus(connection_string)}"
    engine = create_engine(connection_url)
    sql_df = pd.read_sql("SELECT * FROM Parts", con=engine)
    
    print(sql_df.head())

Ошибка: Traceback (последний вызов последним): File "C: / Users / thia go .ribeiro / .PyCharmCE2019.1 / config / scratches / scratch.py ​​", строка 17, в файле engine = create_engine (connection_url) File" C: \ Users \ thia go .ribeiro \ AppData \ Local \ Programs \ Python \ Python38 \ lib \ site-packages \ sqlalchemy \ engine_ init _. Py ", строка 500, в create_engine return strategy.create (* args, ** kwargs) File" C: \ Users \ thia go .ribeiro \ AppData \ Local \ Programs \ Python \ Python38 \ lib \ site-packages \ sqlalchemy \ engine \ strategy.py ", строка 61, в c reate entrypoint = u._get_entrypoint () File "C: \ Users \ thia go .ribeiro \ AppData \ Local \ Programs \ Python \ Python38 \ lib \ site-packages \ sqlalchemy \ engine \ url.py", строка 172, в _get_entrypoint cls = registry.load (name) File "C: \ Users \ thia go .ribeiro \ AppData \ Local \ Programs \ Python \ Python38 \ lib \ site-packages \ sqlalchemy \ util \ langhelpers. py ", строка 267, при увеличении нагрузки ex c .NoSuchModuleError (sqlalchemy.ex c .NoSuchModuleError: не удается загрузить плагин: sqlalchemy.dialects: access.pyodb c

После этого i Я пытался использовать pyodb c, но также были обнаружены следующие ошибки.

    from zipfile import ZipFile
    from io import BytesIO
    from urllib.request import urlopen
    import pyodbc
    import pandas as pd
    
    r = urlopen("https://rgl.faa.gov/Regulatory_and_Guidance_Library/rgPMA.nsf/f6a80b2e3c91131686257bcf0063a042/bc1b3424cc899bee86257beb006237ae/$FILE/PMA.zip").read()
    file = ZipFile(BytesIO(r))
    pma_accdb = file.open("PMA.accdb")
    
    driver = '{Microsoft Access Driver (*.mdb, *.accdb)}'
    filepath = pma_accdb
    
    myDataSources = pyodbc.dataSources()
    access_driver = myDataSources['MS Access Database']
    
    cnxn = pyodbc.connect(driver=access_driver, dbq=filepath, autocommit=True)
    crsr = cnxn.cursor()
    crsr.execute("SELECT * FROM Parts")
    
    sql_df = pd.read_sql("SELECT * FROM Parts", con=engine)
    
    print(sql_df.head())

Ошибка: Traceback (последний вызов последний): строка 17, в cnxn = pyodb c .connect (driver = access_driver, dbq = filepath, autocommit = True) pyodb c .Error: ('HY000', '[HY000] [Microsoft] [Driver ODB C Microsoft Access] общая ошибка не удается открыть раздел реестра. Временная ( volatile) Ace DSN для процесса 0x2ef c Thread 0x4a20 DB C 0xd39ea788

Сказанное выше может вы, пожалуйста, помогите мне понять, где мой код неправильный, и как я могу его улучшить, чтобы читать MS Access с URL-адреса и преобразовывать его во фрейм данных pandas?

1 Ответ

0 голосов
/ 16 июля 2020

Мне помог друг. это было решение:


        from zipfile import ZipFile
        from io import BytesIO
        import urllib
        from urllib.request import urlopen
        from sqlalchemy import create_engine
        import pandas as pd
        
        resp = urlopen("https://rgl.faa.gov/Regulatory_and_Guidance_Library/rgPMA.nsf/f6a80b2e3c91131686257bcf0063a042/bc1b3424cc899bee86257beb006237ae/$FILE/PMA.zip").read()
        zipfile = ZipFile(BytesIO(resp))
        
        connection_string = (r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
        r'DBQ=' + zipfile.extract('PMA.accdb') + ';'
        r'ExtendedAnsiSQL=1;'
        )
        connection_url = f"access+pyodbc:///?odbc_connect={urllib.parse.quote_plus(connection_string)}"
        engine = create_engine(connection_url)
        sql_df = pd.read_sql("SELECT * FROM Parts", con=engine)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...