6
août
2025
Opérations sur les fichiers par lots - renommer et fusionner le PDF
18:24

Opérations sur les fichiers par lots - renommer et fusionner le PDF

6 août 2025 18:24

J'ai décidé de partager deux programmes en Python. La première consiste à renommer les fichiers par numéro de série en fonction de la date de création. La seconde consiste à combiner les fichiers PDF par leur numéro.

La tâche au travail consistait à numériser les dernières feuilles du manuel d'utilisation, où est indiqué le numéro de série. Il y avait 6 de ces fichiers.

Les ensembles de documents ont été placés manuellement dans des dossiers numérotés 01, 02, 03, etc. jusqu'au dernier.
Une feuille - un fichier PDF. Ensuite, certains d’entre eux ont été regroupés en deux feuilles.

Le dossier 01 contient 6 fichiers

  • nom aléatoire. PDF
  • nom aléatoire. PDF
  • nom aléatoire. PDF
  • nom aléatoire. PDF
  • nom aléatoire. PDF
  • nom aléatoire. PDF

Tâche : obtenir 01 défini dans le dossier
01_res1.pdf
01_res2.pdf
01_res3.pdf
01_res4.pdf

Divisé la tâche en deux sous-tâches :

  • Parcours des dossiers et renommage des fichiers par date de création - dans le nom du dossier + numéro de série : 01-1.pdf, 01-2.pdf, 01-3.pdf, 01-4.pdf, 01-5.pdf et 01-6.pdf.
  • combinaison de fichiers selon l'algorithme : 3 et 4 dans un fichier PDF, 5 et 6 dans un autre fichier PDF.

Premier scénario renommer_files.py peut être utile pour renommer par lots des fichiers non seulement au format PDF, mais dans n'importe quel format.
Deuxième scénario combiner_files.py implémente la logique de fusion des fichiers PDF dans chaque répertoire.


Paramètre d'entrée pour les programmes en cours d'exécution- nom du dossier parent (qui contient les sous-dossiers 01, 02, 03, etc.).

Exemple de lancement :

python rename_files.py /home/user/parent_folder
python combine_files.py /home/user/parent_folder

où parent_folder contient les dossiers 01, 02, 03, etc. avec des fichiers PDF.

Exécutez rename_files.py avec prudence, pas dans le répertoire de travail, car tous les fichiers sont renommés en mode batch sans invite.

Contenu du fichier rename_files.py :

# This script takes path to directory with set of subdirectories, numbered 01, 02, 03, ... etc.

et renomme les fichiers PDF dans les sous-répertoires après le nom du sous-répertoire et le nombre entier dans l'ordre de création du fichier.

exemple : avant l'exécution du script, le sous-répertoire 01 est constitué de fichiers : random912371.pdf, random167722.pdf, random561724.pdf

et après l'exécution du script, dans le sous-répertoire 01 les fichiers renommés en : 01-1.pdf,

01-2.pdf, 01-3.pdf

importer le système d'exploitation
à partir du chemin d'importation pathlib
système d'importation
importer pathlib

def list_dirs (chemin_dossier) :
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isdir(file_path):
dir_path = file_path
print(f "Processing directory '{dir_path}'")
rename_files_with_creation_date(dir_path)
print("Done!")

def rename_files_with_creation_date(folder_path) :

tpl = "{0}-{num:02d}"

tpl = "{0}-{num}" 
cnt = 1
folder_name = folder_path.split("/")[-1]
nom_dossier_parent = os.path.split(chemin_dossier)[-1]
os.chdir(folder_path)
files = filter(os.path.isfile, os.listdir(folder_path))  #obtenir uniquement des fichiers
files = [os.path.join(folder_path, f)
         for f in files]  #ajouter le chemin dossier_chemin à chaque fichier f
files.sort(key=lambda x: os.path.getmtime(x))  #trier par heure de création

for filename in files:
    #print(f "{cnt}. Renommer '{filename}'...")
    if os.path.isfile(filename):
        ext = pathlib.Path(filename).suffix
        new_name = tpl.format(folder_name, num=cnt) + ext
        filename_new = os.path.join(folder_path, new_name)
        if (filename != filename_new):
            print(f "Ranaming '{filename}' to '{filename_new}'")
            if not os.path.isfile(filename_new):
                os.rename(filename, filename_new)
                #imprimer("OK")
            else:
                print(f "File '{filename_new}' exists, skipping.")
        cnt = cnt + 1

si name == "main":
if len(sys.argv) == 2:
folder_path = sys.argv[1]
sinon :
folder_path = input("Enter the folder path: ")
list_dirs(folder_path)

En plus de la combinaison, le fichier combine_files.py implémente la rotation des pages du mode portrait au mode paysage (90 degrés). Cette transformation peut être supprimée en modifiant le texte source du script.

# This script combines files

importer le système d'exploitation
système d'importation
importer pathlib
journalisation des importations
importer un thread
heure d'importation
à partir du chemin d'importation pathlib
à partir du sous-processus d'importation PIPE, exécutez

def list_dirs (chemin_dossier) :
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isdir(file_path):
dir_path = file_path
print(f "Processing directory '{dir_path}'")
combine_files(dir_path)
print("Done!")

def combine_files (chemin_dossier) :
folder_name = folder_path.split("/")[-1]
parent_folder_name = os.path.split(folder_path)[-1]
os.chdir(folder_path)
files = filter(os.path.isfile, os.listdir(folder_path))
files = sorted(files)

cnt = 1
for filename in files:
    full_name = os.path.join(folder_path, filename)
    if (filename == parent_folder_name + "-1.pdf"):
        suffix = "_res1.pdf" 
        new_name = folder_name + suffix
        cmdstr = "qpdf " + full_name + " " + new_name + " --rotate=+90" 
        print(cmdstr)
        result = run(cmdstr.split(" "))
        time.sleep(1)
        cmdstr = "rm " + full_name
        print(cmdstr)
        result = run(cmdstr.split(" "))
    if (filename == parent_folder_name + "-2.pdf"):
        suffix = "_res2.pdf" 
        new_name = folder_name + suffix
        new_name = os.path.join(folder_path, new_name)
        cmdstr = "qpdf " + full_name + " " + new_name + " --rotate=+90" 
        print(cmdstr)
        result = run(cmdstr.split(" "))
        time.sleep(1)
        cmdstr = "rm " + full_name
        print(cmdstr)
        result = run(cmdstr.split(" "))
    if (filename == parent_folder_name + "-3.pdf"):
        suffix = "_res3.pdf" 
        new_name = folder_name + suffix
        full_new_name = os.path.join(folder_path, new_name)
        cmdstr = "qpdf --empty --pages " + full_name + " " + \
            full_name.replace("3.pdf", "4.pdf") + " -- --rotate=+90 " + full_new_name
        print(cmdstr)
        result = run(cmdstr.split(" "))
        time.sleep(1)
        cmdstr = "rm " + full_name
        print(cmdstr)
        result = run(cmdstr.split(" "))
    if (filename == parent_folder_name + "-4.pdf"):
        cmdstr = "rm " + os.path.join(folder_path, filename)
        print(cmdstr)
        result = run(cmdstr.split(" "))
    if (filename == parent_folder_name + "-5.pdf"):
        suffix = "_res4.pdf" 
        new_name = folder_name + suffix
        full_new_name = os.path.join(folder_path, new_name)
        cmdstr = "qpdf --empty --pages " + full_name + " " + \
            full_name.replace("5.pdf", "6.pdf") + " -- --rotate=+90 " + full_new_name
        print(cmdstr)
        result = run(cmdstr.split(" "))
        time.sleep(1)
        cmdstr = "rm " + os.path.join(folder_path, filename)
        print(cmdstr)
        result = run(cmdstr.split(" "))
    if (filename == parent_folder_name + "-6.pdf"):
        cmdstr = "rm " + os.path.join(folder_path, filename)
        print(cmdstr)
        result = run(cmdstr.split(" "))

si name == "main":
if len(sys.argv) == 2:
folder_path = sys.argv[1]
else:
folder_path = input("Enter the folder path: ")
list_dirs(folder_path)

Archiver avec 2 programmes :
rename_files_by_created_date_and_combine.zip

J'ai eu l'idée de renommer les fichiers à partir d'ici :GitHub - renommer les fichiers par date de création, mais là, le nom du fichier est sous la forme Day_Month_Year_Hour_Minute_Second, et j'ai FOLDER_NAME-sequence_number.



Publications connexes