openpyxl — импорт ошибки в скрипте Python

#python #openpyxl

#python #openpyxl

Вопрос:

У меня работает скрипт на python (который я не писал), который циклически перебирает папку SQL-скриптов, конденсирует SQL-запросы в одну строку каждый и добавляет их в документ Excel (вместе с другими столбцами). Этот скрипт всегда работал нормально до этой недели, когда мой рабочий компьютер умер. Я получил новый, установил miniconda, а затем установил openpyxl, открыв приглашение Anaconda и:

 pip install openpyxl
  

(установка pip3 не сработала).

Большинство моих скриптов на Python работают нормально, но этот нет. Выдает ошибку:

 ImportError: cannot import name 'range' from 'openpyxl.compat' (C:UsersxxxAppDataLocalContinuumminiconda3libsite-packagesopenpyxlcompat__init__.py)
  

Я попытался перейти к библиотекам / сайтам-пакетам, чтобы увидеть подробности, и я больше не вижу ‘range’, указанный в файле инициализации для этого пути. Может быть, они избавились от этого? Кто-нибудь знает, какая для этого подходящая альтернатива? Честно говоря, я даже не могу сказать, где это используется в скрипте, но когда я вынимаю эту инструкцию import, она запускается, но в результате получается пустой выходной файл Excel. Очевидно, что он где-то используется

 import sqlparse
import glob
import sys
import regex as re
import os
import openpyxl
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
from openpyxl.compat import range

def main():

    path = "C:/my_pathsql_files*"
    fileList = glob.glob(path)

    TABLE_ID = 0
    # TABLE_NM = ''
    # STEP_ID = 0
    STEP_TYPE = ''

    # workFile = open('C:/DevDataWarehouseTestingworkfile.txt', 'w')
    # wb = openpyxl.load_workbook('workfile.xlsx')

    wb = Workbook()
    ws1 = wb.active
    ws1.title = "auto_tests"

    # Adding the headers for the Excel sheet.
    ws1['A1'] = 'TABLE_ID'
    ws1['B1'] = 'TABLE_NM'
    ws1['C1'] = 'TEST_TABLE_NM'
    ws1['D1'] = 'STEP_ID'
    ws1['E1'] = 'STEP_TYPE'
    ws1['F1'] = 'SQL_SCRIPT'

    def createSQL(pTABLE_ID, pTABLE_NM, pTEST_TABLE_NM, pSTEP_ID, pSTEP_TYPE, pSqlStr):
        pSqlStr = pSqlStr.replace(''','"')
        sliceLeft = pSqlStr[:6]
        if sliceLeft == 'SELECT':
            pSTEP_TYPE = 'T'
        elif sliceLeft != 'SELECT':
            pSTEP_TYPE = 'P'

        max_row = ws1.max_row
        nextRow = str(max_row   1)

        ws1['A'   nextRow] = str(pTABLE_ID)
        ws1['B'   nextRow] = pTABLE_NM
        ws1['C'   nextRow] = pTEST_TABLE_NM
        ws1['D'   nextRow] = str(pSTEP_ID)
        ws1['E'   nextRow] = pSTEP_TYPE
        ws1['F'   nextRow] = pSqlStr



    def createTableTestSQL(mFile, TABLE_ID,  TABLE_NM,STEP_ID, STEP_TYPE):
        mText = mFile.read()
        mSqls = sqlparse.split(mText)
        for mSql in mSqls:
            STEP_ID  = 1
            sqlStr = str(mSql.replace('n',' '))
            sqlStr = re.sub('--([^s] )',' ',sqlStr)
            sqlStr = sqlparse.format(sqlStr, strip_comments=True)
            if STEP_ID == 1:
                TEST_TABLE_NM = sqlStr.replace("DROP TABLE ", "").replace(";", "")
            createSQL(TABLE_ID, TABLE_NM, TEST_TABLE_NM, STEP_ID, STEP_TYPE, sqlStr)


    for filename in fileList:
        if filename.endswith('.sql'):
            mFile = open(filename,'r')
            TABLE_ID  = 1
            TABLE_NM = os.path.split(filename)[1].replace('.sql','')
            #TEST_TABLE_NM = ''
            STEP_ID = 0
            createTableTestSQL(mFile, TABLE_ID, TABLE_NM, STEP_ID, STEP_TYPE)
            mFile.close()

    wb.save(filename='test_data_TR.xlsx')

if __name__ == "__main__":
    main()
  

Комментарии:

1. Почему вы пытаетесь импортировать range в свой код? Не похоже, что вы его используете.

2. @CharlieClark это то, о чем я думал, но когда я извлекаю это, это просто приводит к пустому файлу Excel, хотя после циклического выполнения SQL-скриптов должны быть строки

3. Это будет что-то другое, ничего не связанное с импортом.

4. понял, я продолжу поиск причины. Спасибо

5. Вы когда-нибудь находили решение для этого?