Renommer fichiers pdf en masse en fonction du contenu - incrémenter numérotation
Bonjour,
Je souhaite renommer tous les fichiers pdf d'un dossier en fonction de 2 informations que je récupère dans le fichier pdf:
- une date (récupérée via expression régulière)
- un numéro à dix chiffres commençant par 45 ou 55 (via expression régulière aussi)
Le nouveau nom de fichier est une concaténation de la date et du numéro, exemple : "20220903_5500000362"
Le problème est qu'il arrive parfois que ce nouveau nom de fichier existe déjà.
Si c'est la cas, j'aimerais alors que le fichier se nomme par exemple "20220903_5500000362_2"
Je n'arrive pas à implémenter ça, je galère depuis plusieurs jours...
Merci de votre aide!
Hello Actarus,
pour ce genre de cas de figure, avant d'écrire ton fichier, il faut vérifier s'il existe.
if os.path.isfile(filename)
S'il existe tu lui changes son nom:
filename = f"{filename[:-4]}_2.txt"
j'ai un problème avec l'indentation dans l'écriture de ma réponse, du coup je te mets lien vers le gist avec le script exemple complet. Ou en image ci dessous
Tiens moi au courant si ça répond à ton besoin.
A +
Salut,
Malheureusement je n'arrive toujours pas à faire ce que je veux pour renommer les fichiers...
Voici mon script, j'utilise pathlib mais avec cette solution tous les noms de fichiers avec le même nom ont tous "_0" à la fin du nom, alors que j'aimerais pouvoir afficher "_1", "_2" etc à la fin du fichier si nécéssaire.
Et donc comme je n'arrive pas à faire évoluer le nom des fichiers avec le même le nom, quand j'utilise la fonction rename de pathlib j'obtiens WinError fichier existe déjà...
import pdfplumber
from pathlib import Path
import re
from datetime import datetime
SOURCE_FILE = Path(__file__).resolve()
SOURCE_DIR = SOURCE_FILE.parent / "WORKING_DIRECTORY"
list_files = [file for file in SOURCE_DIR.iterdir() if (file.is_file() and (file.suffix == ".pdf" or file.suffix == ".PDF"))]
new_list = []
counts = {}
for i, file in enumerate(list_files):
count = 0
with pdfplumber.open(file) as pdf_object: #The open method returns an instance of the pdfplumber.PDF class
pdf_metadata_info = pdf_object.metadata
list_pages = pdf_object.pages[0:]
full_pdf_text = ''
for page in list_pages:
text = page.extract_text()
full_pdf_text += text
try:
date_str = str(pdf_metadata_info['CreationDate'])
creation_date = date_str[2:10]
except:
match_date1 = re.search(r"(\d{2}[-/.]\d{2}[-/.]\d{2,4})", full_pdf_text, re.IGNORECASE)
match_date2 = re.search(r"[a-zA-Z]+\s\d{1,2}\s[a-zA-Zéè]+\s\d{2,4}", full_pdf_text, re.IGNORECASE)
if match_date1:
date1 = match_date1.group(1)
if "/" in date1:
try:
date_object1 = datetime.strptime(date1, "%d/%m/%Y")
creation_date = datetime.strftime(date_object1, "%Y%m%d")
except:
creation_date = "creation_date"
elif "-" in date1:
try:
date_object1 = datetime.strptime(date1, "%d-%m-%Y")
creation_date = datetime.strftime(date_object1, "%Y%m%d")
except:
creation_date = "creation_date"
elif "." in date1:
try:
date_object1 = datetime.strptime(date1, "%d.%m.%Y")
creation_date = datetime.strftime(date_object1, "%Y%m%d")
except:
creation_date = "creation_date"
else:
creation_date = "creation_date"
elif match_date2: #ce cas n'est pas géré encore!!! A faire
creation_date = "creation_date"
else: # si rien ne matche, dans tous les cas on renvoie la chaine "creation_date"
creation_date = "creation_date"
if match_PO_spot:= re.search(r"(450\d{7})", full_pdf_text):
PO_spot = match_PO_spot.group()
new_file_name = f"{creation_date}_{PO_spot}_{count}{file.suffix.lower()}"
else:
PO_spot = ""
new_file_name = "no_PO_found"
if match_PO_schedule:= re.search(r"(550\d{7})", full_pdf_text):
PO_schedule = match_PO_schedule.group()
new_file_name = f"{creation_date}_{PO_schedule}_{count}{file.suffix.lower()}"
else:
PO_schedule = ""
new_file_name = "no_PO_found"
#création du nouveau chemin
new_file_path = file.parent.joinpath(new_file_name)
# ajout de ce chemin à la liste new_list
new_list.append(new_file_path)
#si nom du chemin dans la liste
if new_file_path in new_list:
count += 1 #on incrémente le compteur et on renomme:
new_file_path = file.parent.joinpath(new_file_name)
print(new_list)
Merci d'avance de votre aide!
Hello,
je n'ai pas lancé ton script mais du coup pour ton problème où tu as un fichier qui existe déjà avec un _0.pdf à la fin par exemple: my_filename=something_0.pdf. Tu peux faire comme suit pour récupérer le numéro du fichier.
myfilename_number = my_filename[:-4].split("_")[-1]
En gros tu enlèves l'extension du fichier et tu coupes le string en entre les "_" . Tu obtiens une liste et tu ne prends que le dernier élément:
In [1]: my_filename = "something_0.pdf"
In [2]: my_filename[:-4]
Out[2]: 'something_0'
In [3]: 'something_0'.split("_")[-1]
Out[3]: '0'
et tu lui incrémentes ce numéro.
En gros je ferais comme ça:
import os
import fnmatch
for i in [1, 3, 5]:
# tentative de nomage de fichier
filename = f"fichier{i}"
# chercher le nombre de fichier qui ont le même nom racine
existing_files = [elem for elem in fnmatch.filter(os.listdir(), f"{filename}_*" )]
try:
# trouver l'extension de fichier la plus élevée pour un même nom de fichier
find_occu = lambda elem:int(elem[:-4].split("_")[-1]) # trouver le numéro d'occurence
max_occu = max([find_occu(elem) for elem in existing_files])
new_filename = f"{filename}_{max_occu + 1}.txt"
except ValueError:
# cas ou le fichier_0 n'existe pas car la liste existing_files est vide
new_filename = f"{filename}_0.txt"
with open(new_filename, "w"):
pass
Cela fonctionne si à la base dans ton dossier tes fichiers initialement s'appellent "monfichier_0.pdf"
Voici un exemple de mon dossier test:
J'espère que ça t'aidera. On peut en parler en call si besoin.
a +
Bonjour William, tu as question sur ce sujet ?
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte