Compare commits
No commits in common. "9853538308b9a957803e0059e76bdc0ed1f6c685" and "8d8987ee15a27193387470842a84c3986f1b3009" have entirely different histories.
9853538308
...
8d8987ee15
162
dory_sort_out.py
162
dory_sort_out.py
@ -1,7 +1,6 @@
|
||||
"""
|
||||
Sert a créer l'arborescence pour le dossier CNIG, renommer et ranger les .pdf
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import glob
|
||||
@ -25,7 +24,6 @@ FOLDERNAMES = [
|
||||
]
|
||||
|
||||
ANNEXE_FOLDER_ID = 4
|
||||
PLANS_DE_SECTEUR_ID = 7
|
||||
|
||||
# Les mots clef associés à chaque dossier
|
||||
KEYWORDS = {
|
||||
@ -38,7 +36,7 @@ KEYWORDS = {
|
||||
"Reglement": FOLDERNAMES[3],
|
||||
"Orientations_amenagement": FOLDERNAMES[5],
|
||||
"POA": FOLDERNAMES[6],
|
||||
"Plan_de_secteurs": FOLDERNAMES[7],
|
||||
"Plan_de_secteur": FOLDERNAMES[7],
|
||||
}
|
||||
|
||||
def confirm_choice(choice) -> bool:
|
||||
@ -53,7 +51,7 @@ def confirm_choice(choice) -> bool:
|
||||
|
||||
def test_date(date_input: str):
|
||||
"""teste si la date donnée est valide"""
|
||||
# Pattern pour vérifier qu'il y a bien 8 chiffres, 4 pour l'année, 2 pour le mois, 2 pour le jour
|
||||
# Pattern pour vérifier qu'il y a bien 8 chiffres, 4pour l'année, 2 pour le mois, 2 pour le jour
|
||||
# permet d'exclure les erreurs de frappes, comme les "." les " " ou les lettres
|
||||
pattern = r"^\d{4}\d{2}\d{2}$"
|
||||
|
||||
@ -70,7 +68,6 @@ def test_date(date_input: str):
|
||||
print("Erreur de frappe, la date ne noit contenir que 8 chiffres")
|
||||
return False
|
||||
|
||||
|
||||
def test_siren_insee(is_plu: bool, number: str):
|
||||
"""teste si le numero Siren ou Insee donné est valide"""
|
||||
if is_plu:
|
||||
@ -86,7 +83,6 @@ def test_siren_insee(is_plu: bool, number: str):
|
||||
print("Le numero siren est invalide")
|
||||
return False
|
||||
|
||||
|
||||
def create_folders(is_plu: bool, prefixe, suffixe):
|
||||
"""Crée l'arborescence"""
|
||||
main_path = f"{prefixe}_PLU{"i" if not is_plu else ""}_{suffixe}"
|
||||
@ -115,93 +111,60 @@ def create_folders(is_plu: bool, prefixe, suffixe):
|
||||
|
||||
return main_path
|
||||
|
||||
|
||||
def correct_file_name(file):
|
||||
"""
|
||||
Corrige les erreurs de nomage des fichiers
|
||||
espaces et tirets deviennent des underscore
|
||||
Corrige les erreurs de nomage des fichiers
|
||||
espaces et tirets deviennent des underscore
|
||||
"""
|
||||
basename = os.path.basename(file)
|
||||
correct_file = basename.replace(" ", "_").replace("-", "_")
|
||||
correct_file = basename.replace(" ","_").replace("-","_")
|
||||
|
||||
# Supprime les accents et les convertis en minuscules
|
||||
correct_file = "".join(
|
||||
(c if unicodedata.category(c) != "Mn" else "")
|
||||
for c in unicodedata.normalize("NFD", correct_file)
|
||||
# Supprime les accents et les convertis en minuscules
|
||||
correct_file = ''.join(
|
||||
(c if unicodedata.category(c) != 'Mn' else '')
|
||||
for c in unicodedata.normalize('NFD', correct_file)
|
||||
)
|
||||
correct_file = os.path.join(os.path.dirname(file), correct_file)
|
||||
os.rename(file, correct_file)
|
||||
correct_file = os.path.join(os.path.dirname(file),correct_file)
|
||||
os.rename(file,correct_file)
|
||||
return correct_file
|
||||
|
||||
|
||||
def sort_files(prefixe, suffixe, sort_path):
|
||||
"""
|
||||
Range les fichiers dans l'arborescence, selon des mots clefs
|
||||
Renvoi un dictionaire avec tous les noms de fichiers trouvés et leur compte
|
||||
Range les fichiers dans l'arborescence, selon des mots clefs
|
||||
Renvoi un dictionaire avec tous les noms de fichiers trouvés et leur compte
|
||||
"""
|
||||
# cherche tous les fichiers pdf présents dans l'arborescence
|
||||
# à partir du Current working directory,
|
||||
# y compris ceux dans des dossiers
|
||||
files = glob.glob(os.getcwd() + "/**/*.pdf", recursive=True)
|
||||
|
||||
# compte le nombre de fois mot clef apparait
|
||||
#compte le nombre de fois mot clef apparait
|
||||
keyword_count = {key: 0 for key in KEYWORDS}
|
||||
folders_file_count = [0] * len(FOLDERNAMES)
|
||||
|
||||
for file in files:
|
||||
no_keyword = True
|
||||
|
||||
# corrige les erreur de nommage de fichiers
|
||||
#corrige les erreur de nommage de fichiers
|
||||
file = correct_file_name(file)
|
||||
|
||||
sector = re.search(r'SECT(\d{2})',file)
|
||||
#Test cas particuliers Plans de secteurs
|
||||
if sector:
|
||||
sector_name = sector.group(0)
|
||||
folder_path = f"{sort_path}/7_Plans_de_secteur/{sector_name}"
|
||||
if not os.path.isdir(folder_path):
|
||||
os.mkdir(folder_path)
|
||||
os.mkdir(f"{folder_path}/3_Reglement")
|
||||
os.mkdir(f"{folder_path}/5_Orientations_amenagement")
|
||||
|
||||
specific_keywords = ["Reglement_graphique","Reglement","Orientations_amenagement"]
|
||||
|
||||
for index, keyword in enumerate(specific_keywords):
|
||||
if keyword.lower() in file.lower():
|
||||
filename = f"{prefixe}_{keyword}_{sector_name}_{suffixe}.pdf"
|
||||
newpath =""
|
||||
if index <= 1:
|
||||
newpath = f"{folder_path}/3_Reglement"
|
||||
else:
|
||||
newpath = f"{folder_path}/5_Orientations_amenagement"
|
||||
|
||||
renamed = os.path.join(os.path.dirname(file),filename)
|
||||
os.rename(file,renamed)
|
||||
shutil.move(renamed,newpath)
|
||||
folders_file_count[PLANS_DE_SECTEUR_ID] += 1
|
||||
break
|
||||
continue
|
||||
|
||||
for keyword, folder in KEYWORDS.items():
|
||||
|
||||
# Si le mot clef (en minuscule) est dans le nom du fichier (en minuscule)
|
||||
if keyword.lower() in file.lower():
|
||||
|
||||
keyword_count[keyword] += 1
|
||||
keyword_count[keyword] +=1
|
||||
filename = keyword
|
||||
if keyword_count[keyword] > 1:
|
||||
# Le nouveau nom du fichier
|
||||
filename += "_" + str(keyword_count[keyword] - 1)
|
||||
# Le dossier de destination du fichier
|
||||
# Le dossier de destination du fichier
|
||||
|
||||
new_path = sort_path + "/" + folder
|
||||
# Le nouveau nom du fichier
|
||||
renamed = os.path.join(
|
||||
os.path.dirname(file),
|
||||
prefixe + "_" + filename + "_" + suffixe + ".pdf",
|
||||
)
|
||||
prefixe + "_" + filename + "_" + suffixe + ".pdf",)
|
||||
|
||||
folders_file_count[int(folder[0])] += 1
|
||||
folders_file_count[int(folder[0])] +=1
|
||||
os.rename(file, renamed)
|
||||
shutil.move(renamed, new_path)
|
||||
no_keyword = False
|
||||
@ -209,83 +172,68 @@ def sort_files(prefixe, suffixe, sort_path):
|
||||
# si aucun mot clef n'a été trouvé dans le nom du fichier,
|
||||
# on l'envoi dans le dossier Annexes
|
||||
if no_keyword:
|
||||
# on s'assure que le nom commence par une majuscule
|
||||
#on s'assure que le nom commence par une majuscule
|
||||
filename = os.path.splitext(os.path.basename(file))[0].capitalize()
|
||||
|
||||
# on ajoute le nom du fichier dans le dictionnaire
|
||||
#on ajoute le nom du fichier dans le dictionnaire
|
||||
if not filename in keyword_count:
|
||||
keyword_count.update({filename: 1})
|
||||
keyword_count.update({filename:1})
|
||||
else:
|
||||
keyword_count[filename] += 1
|
||||
filename += "_" + str(keyword_count[filename] - 1)
|
||||
|
||||
renamed = os.path.join(
|
||||
os.path.dirname(file),
|
||||
prefixe + "_" + filename + "_" + suffixe + ".pdf",
|
||||
prefixe
|
||||
+ "_"
|
||||
+ filename
|
||||
+ "_"
|
||||
+ suffixe
|
||||
+ ".pdf",
|
||||
)
|
||||
os.rename(file, renamed)
|
||||
shutil.move(renamed, sort_path + "/" + FOLDERNAMES[ANNEXE_FOLDER_ID])
|
||||
folders_file_count[ANNEXE_FOLDER_ID] += 1
|
||||
|
||||
return folders_file_count
|
||||
return keyword_count, folders_file_count
|
||||
# return True
|
||||
|
||||
|
||||
def error_report(folder_data):
|
||||
def error_report(file_data,folder_data):
|
||||
"""
|
||||
Crée le rapport d'utilisation du script
|
||||
Crée le rapport d'utilisation du script
|
||||
"""
|
||||
# Couleurs de cellules
|
||||
error_color = PatternFill(patternType="solid", fgColor="00cb4335")
|
||||
column_name_color = PatternFill(patternType="solid", fgColor="0085929e")
|
||||
row_color = PatternFill(patternType="solid", fgColor="00ccd1d1")
|
||||
#Couleur rouge
|
||||
error_color = PatternFill(patternType='solid',fgColor='00cb4335')
|
||||
column_name_color = PatternFill(patternType='solid',fgColor='0085929e')
|
||||
row_color = PatternFill(patternType='solid',fgColor='00ccd1d1')
|
||||
|
||||
report = xls.Workbook()
|
||||
report_worsheet = report.active
|
||||
|
||||
# Nomme la worksheet et les colonnes du tableau
|
||||
report_worsheet.title = "Compte rendu"
|
||||
report_worsheet["B1"] = "Dossiers"
|
||||
report_worsheet["C1"] = "NB Fichiers"
|
||||
report_worsheet["D1"] = "Rapport d'erreur"
|
||||
report_worsheet['B1'] = "Dossiers"
|
||||
report_worsheet['C1'] = "NB Fichiers"
|
||||
report_worsheet['D1'] = "Rapport d'erreur"
|
||||
|
||||
# Triple la largeur des colonnes pour plus de clarté
|
||||
report_worsheet.column_dimensions["B"].width *= 3
|
||||
report_worsheet.column_dimensions["C"].width *= 3
|
||||
report_worsheet.column_dimensions["D"].width *= 3
|
||||
report_worsheet.column_dimensions['B'].width *= 3
|
||||
report_worsheet.column_dimensions['C'].width *= 3
|
||||
report_worsheet.column_dimensions['D'].width *= 3
|
||||
|
||||
# Applique la couleur de fond aux cellules titres de colonnes
|
||||
report_worsheet["B1"].fill = report_worsheet["C1"].fill = report_worsheet[
|
||||
"D1"
|
||||
].fill = column_name_color
|
||||
report_worsheet['B1'].fill = report_worsheet['C1'].fill = report_worsheet['D1'].fill = column_name_color
|
||||
|
||||
#on commence à la cellule 2
|
||||
currrent_cell = 2
|
||||
|
||||
# Pour chaque dossiers
|
||||
# On écrit son nom dans la colonne B
|
||||
# On écris le nombre de fichier contenus dans la colonne C
|
||||
for i, content in enumerate(folder_data):
|
||||
report_worsheet["B" + str(currrent_cell)] = FOLDERNAMES[i]
|
||||
report_worsheet["C" + str(currrent_cell)] = content
|
||||
|
||||
# 1 ligne sur 2 change de couleur
|
||||
report_worsheet['B'+ str(currrent_cell)] = FOLDERNAMES[i]
|
||||
report_worsheet['C'+ str(currrent_cell)] = content
|
||||
if i % 2 == 0:
|
||||
report_worsheet["B" + str(currrent_cell)].fill = report_worsheet[
|
||||
"C" + str(currrent_cell)
|
||||
].fill = report_worsheet["D" + str(currrent_cell)].fill = row_color
|
||||
report_worsheet['B'+ str(currrent_cell)].fill = report_worsheet['C'+ str(currrent_cell)].fill = report_worsheet['D'+ str(currrent_cell)].fill = row_color
|
||||
|
||||
# Si dossier vide Erreur Colonne D
|
||||
if content == 0:
|
||||
report_worsheet["D" + str(currrent_cell)] = (
|
||||
"/!\\ aucun fichier dans le dossier /!\\"
|
||||
)
|
||||
report_worsheet["D" + str(currrent_cell)].fill = error_color
|
||||
currrent_cell += 1
|
||||
report_worsheet['D'+ str(currrent_cell)] = "/!\\ aucun fichier dans le dossier /!\\"
|
||||
report_worsheet['D'+ str(currrent_cell)].fill = error_color
|
||||
currrent_cell+=1
|
||||
|
||||
report.save("Rapport.xlsx")
|
||||
|
||||
|
||||
def sortout():
|
||||
"""Classe le dossier voulu selon les donées renseignées par l'utilisateur"""
|
||||
is_plu = True
|
||||
@ -306,14 +254,8 @@ def sortout():
|
||||
|
||||
# On demande le numero INSEE ou SIREN tant que l'input est invalide
|
||||
while True:
|
||||
print(
|
||||
(
|
||||
"numero INSEE (Format 5 chiffres): "
|
||||
if is_plu
|
||||
else "numero siren (Format 9 chiffres): "
|
||||
),
|
||||
end="",
|
||||
)
|
||||
print("numero INSEE (Format 5 chiffres): "
|
||||
if is_plu else "numero siren (Format 9 chiffres): ", end="")
|
||||
prefixe = input()
|
||||
if test_siren_insee(is_plu, prefixe) and confirm_choice(prefixe):
|
||||
break
|
||||
@ -327,6 +269,6 @@ def sortout():
|
||||
|
||||
main_path = create_folders(is_plu, prefixe, suffixe)
|
||||
|
||||
donnees_dossiers = sort_files(prefixe, suffixe, main_path)
|
||||
donees_fichiers, donnees_dossiers = sort_files(prefixe, suffixe, main_path)
|
||||
|
||||
error_report(donnees_dossiers)
|
||||
error_report(donees_fichiers,donnees_dossiers)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user