Я довольно плохо знаком с Python и программированием в целом, но я написал скрипт, который автоматизирует некоторую занятую работу. Краткое описание:
- Сценарий создает папку на основе свойства из другой уже существующей таблицы Excel («Registro»)
- Сценарий создает файл Excel дляотслеживать добавляемые или обновляемые pdf-файлы («Lot.xlsx», где lot - номер, соответствующий папке)
- Затем сценарий перемещает все файлы из одной папки в новую папку (с некоторыми критериями для руководствабудь то новый файл, обновление или что-то, что нужно пропустить)
- Затем скрипт добавляет новую строку в файл Excel, чтобы отразить вновь добавленный или обновленный файл в папке
- Этот скрипт выполняет итерацию по строкам в «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")))