При использовании Openpyxl я получаю исключение BadZipFile (но только иногда!) - PullRequest
0 голосов
/ 16 октября 2019

Я довольно плохо знаком с Python и программированием в целом, но я написал скрипт, который автоматизирует некоторую занятую работу. Краткое описание:

  1. Сценарий создает папку на основе свойства из другой уже существующей таблицы Excel («Registro»)
  2. Сценарий создает файл Excel дляотслеживать добавляемые или обновляемые pdf-файлы («Lot.xlsx», где lot - номер, соответствующий папке)
  3. Затем сценарий перемещает все файлы из одной папки в новую папку (с некоторыми критериями для руководствабудь то новый файл, обновление или что-то, что нужно пропустить)
  4. Затем скрипт добавляет новую строку в файл Excel, чтобы отразить вновь добавленный или обновленный файл в папке
  5. Этот скрипт выполняет итерацию по строкам в «Registro» и имел обыкновение делать сотни строк одновременно.

Это работало примерно с 1950 строками документа Excel Registro, прежде чем я начал видеть BadZipFileошибки, когда код будет пытаться получить доступ к недавно созданному Lot.xlsx. Это случается чаще, когда сценарий снова находит многое в Registro и должен повторно получить доступ к файлу Excel, чтобы обновить / добавить новую информацию, но это не всегда происходит, и иногда это будет работать, если я просто перезапущу код для этогомного раз после удаления папки (по сути, начиная с начала).

Недавно я добавил цикл Try ... Except, чтобы получать информацию о каждом выполнении независимо от того, вызвало ли оно исключение или нет. Я пытался без этого, и это все еще иногда выдает исключение. Я также обновился до openpyxl 3.0, но эта ошибка произошла однажды до этого. Наконец, это происходит в сети Citrix, которая иногда немного отстает при обычном использовании, но раньше это не вызывало проблем.

Код довольно длинный, но исключение всегда происходит в последней строке, приведенной ниже. ,Если вам нужен весь файл, дайте мне знать! Я не хотел делиться всеми 600+ строками.

import os
import shutil
import time
import ctypes
import datetime
from pathlib import Path
import sys
import inspect

def lineno():
    """Returns the current line number in our program."""
    return inspect.currentframe().f_back.f_lineno


# Reading and writing an excel file using Python
import xlrd
import xlsxwriter
import openpyxl
from openpyxl.styles import PatternFill


# Give the location of the file
registro = r"C:\Users\1700015\Desktop\LotFolderTests\01_Registro_IIC_remote.xlsx" #Local copy on my machine
lot_loc = r"C:\Users\1700015\Desktop\LotFolderTests\602024-000000-80030-30AL-0006_13.xlsx" #Local copy on my machine
lot_ParentFolder = r"S:\Folders\P1710009_ICE_REM\06_Projet_REM" #Shared network folder wgere the Lot folders will be housed
# To open Workbook
wb = xlrd.open_workbook(lot_loc)
sheet = wb.sheet_by_index(2)
registro_wb = xlrd.open_workbook(registro)
registro_sheet = registro_wb.sheet_by_index(0)


# Choose rows in Registro
start_row = input ("\n\n\n\n\n\nCommence avec ligne : ")
end_row = input ("Termine avec ligne : ")
t = time.time()
directoryNew = []
directoryAlreadyExists = []
missingDocsList = []
docNotInLivrables = []
old_Versions = []
documents_Updated = []
lot_Updated = []
missingLot = []
errorList = []
lastLine = int(start_row)
Liste_Headers = ['ruta','IIC','nombres','Ver.','Status','','Status','Nombre del fichero','Description','Format de fichier']
Historique_Headers = ['ruta','IIC','nombres','Ver.']


### Try...Except code goes below this line
try :
    for j in range(int(start_row)-1,int(end_row)) :
        totalRows = int(j)+1-int(start_row)
        # ! print("Lot is "+lot)
        IIC = registro_sheet.cell_value(j,7)
        if registro_sheet.cell_value(j,10).startswith('4') and not None :
            lot = registro_sheet.cell_value(j,10)
        else :
            missingLot.append("Ligne "+str(j)+" : "+str(IIC))
            continue
        doc_location = os.path.join(r"S:\Folders\P1710009_ICE_REM\03_DOC_IIC",IIC)
        lot_directory = os.path.join(lot_ParentFolder, lot)
        # ! print("   ... attempting to create the directory "+lot_directory)
        if not os.path.exists(lot_directory):
            os.makedirs(lot_directory)
            # ! # ! print("Directory \\"+lot+" created!\n\n")
        else :
            # ! print("Directory \\"+lot+" already exists. Please be certain it contains documents.\n\n")
            directoryAlreadyExists.append(lot_directory)

        if not os.path.isfile(os.path.join(lot_directory,str(lot)+".xlsx")) :
            workbook = xlsxwriter.Workbook(os.path.join(lot_directory,str(lot)+".xlsx"))
            worksheet_Liste = workbook.add_worksheet('02_Liste')
            worksheet_Liste.write(0,0,str(lot))
            worksheet_Liste.write(0,2,'numero de document reçu =')
            worksheet_Liste.write(0,3,'=+COUNTA(INDIRECT("C5:C"&ROWS(C:C)))')
            worksheet_Liste.write(0,7,'numero de document planifier =')
            worksheet_Liste.write(0,8,'=+COUNTA(INDIRECT("H5:H"&ROWS(H:H)))')
            worksheet_Liste.write(1,7,'=+D1/I1*100')
            worksheet_Liste.write(1,8,r'% des documents reçu selon la liste de livrable')
            worksheet_Liste.write(2,1,'Filler')

            n = 0
            for m in Liste_Headers :
                worksheet_Liste.write(3,n,m)
                n += 1
            worksheet_Historique = workbook.add_worksheet('01_Historique')
            n = 0
            for m in Historique_Headers :
                worksheet_Historique.write(0,n,m)
                n += 1
            workbook.close()
            workbook_active = openpyxl.load_workbook(str(os.path.join(lot_directory,str(lot)+".xlsx")))
            worksheet_02Liste = workbook_active['02_Liste']
            worksheet_02Liste.column_dimensions['A'].width = 40
            worksheet_02Liste.column_dimensions['B'].width = 11.5
            worksheet_02Liste.column_dimensions['C'].width = 29.5
            worksheet_02Liste.column_dimensions['D'].width = 4.5
            worksheet_02Liste.column_dimensions['E'].width = 8.5
            worksheet_02Liste.column_dimensions['G'].width = 9.5
            worksheet_02Liste.column_dimensions['H'].width = 29.5
            worksheet_02Liste.column_dimensions['I'].width = 61.5
            worksheet_02Liste.column_dimensions['J'].width = 16.5
            worksheet_01Historique = workbook_active['01_Historique']
            worksheet_01Historique.column_dimensions['A'].width = 40
            worksheet_01Historique.column_dimensions['B'].width = 11.5
            worksheet_01Historique.column_dimensions['C'].width = 29.5
            worksheet_01Historique.column_dimensions['D'].width = 4.5
            workbook_active.save(str(os.path.join(lot_directory,str(lot)+".xlsx")))
        else :
            pass
        # found = 0

        for l in os.listdir(doc_location) :
                if l.endswith(".pdf") and l.startswith("6") :
                    deliverablesCheck = 0
                    perfectMatch = 0
                    doc_name = l
                    document = os.path.join(doc_location,doc_name)
                    doc_destination = os.path.join(lot_directory,doc_name)
                    for m in range(sheet.nrows):

                        if str(l)[:-7] == sheet.cell_value(m,1) and str(lot) == sheet.cell_value(m,0)  :

                            deliverablesCheck += 1
                            perfectMatch += 1
                            break
                        elif str(l)[:-7] == sheet.cell_value(m,1) and not str(lot) == sheet.cell_value(m,0) :
                            deliverablesCheck += 1
                            continue
                        else :
                            pass


                    if deliverablesCheck > 0 and perfectMatch > 0:
                        if os.path.exists(document) :
                            #Does document exist in stated IIC folder?
                            workbook_active = openpyxl.load_workbook(str(os.path.join(lot_directory,str(lot)+".xlsx")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...