Αλλαγή παρτίδας ενός ονόματος αρχείου στην Python προσθέτοντας μια συμβολοσειρά ή έναν αύξοντα αριθμό πριν και μετά το όνομα του αρχείου

Επιχείρηση

Μαζική μετονομασία με χρήση της μονάδας os και της μονάδας glob.

Χρησιμοποιήστε την ενότητα os και την ενότητα glob για να αλλάξετε και να μετονομάσετε μαζικά τα ονόματα αρχείων σε έναν φάκελο προσθέτοντας συμβολοσειρές ή διαδοχικούς αριθμούς πριν και μετά τα ονόματα των αρχείων.

Παράδειγμα δομής αρχείου

Πάρτε την ακόλουθη δομή αρχείου ως παράδειγμα. Σε αυτή την περίπτωση, θεωρείται ότι υπάρχουν μόνο αρχεία (όχι φάκελοι) στο φάκελο.

.
└── testdir
    ├── a.jpg
    ├── b.jpg
    ├── c.jpg
    ├── d.jpg
    └── e.jpg

Πράγματα που πρέπει να έχετε κατά νου

Δεδομένου ότι η διαδικασία περιλαμβάνει τη μετονομασία του αρχείου, αποθηκεύστε το αρχικό αρχείο ξεχωριστά, ώστε να μπορεί να διασωθεί σε περίπτωση αποτυχίας.

Λήψη της λίστας αρχείων με την ενότητα glob

Η ενότητα glob θα βρει όλα τα ονόματα διαδρομής που ταιριάζουν με το καθορισμένο μοτίβο σύμφωνα με τους κανόνες που χρησιμοποιεί το κέλυφος του Unix.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Για παράδειγμα, η ακόλουθη συνάρτηση μπορεί να χρησιμοποιηθεί για να λάβετε μια λίστα με τα ονόματα αρχείων και καταλόγων στον τρέχοντα κατάλογο.
glob.glob('./*')
Το όρισμα μπορεί να είναι μια απόλυτη διαδρομή ή μια σχετική διαδρομή.

Σε αυτό το παράδειγμα, θα έμοιαζε ως εξής.

import glob

print(glob.glob('./testdir/*'))
# => ['./testdir/a.jpg', './testdir/b.jpg', './testdir/c.jpg', './testdir/d.jpg', './testdir/e.jpg']

Αντί για a.jpg, μπορείτε να λάβετε το εξής, με την προσθήκη της διαδρομής του επιχειρήματος.
./testdir/a.jpg

Μπορείτε επίσης να χρησιμοποιήσετε μπαλαντέρ (*) για να λάβετε μόνο συγκεκριμένες επεκτάσεις, όπως φαίνεται παρακάτω.
glob.glob('./testdir/*.jpg')

Μπορεί να χρησιμοποιηθεί το ακόλουθο μοτίβο αντιστοίχισης.

  • *: Ταιριάζει με τα πάντα.
  • ?Ταιριάζει με οποιονδήποτε μεμονωμένο χαρακτήρα.
  • [abc]: Ταιριάζει με έναν μόνο χαρακτήρα από τα a, b ή c.
  • [!abc]: Ταιριάζει με έναν μόνο χαρακτήρα εκτός των a, b ή c

Μετονομασία με os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Μετονομάστε το αρχείο ή τον κατάλογο src σε dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Χρησιμοποιήστε τη συνάρτηση rename() της ενότητας os, η οποία θα το μετονομάσει όπως υποδηλώνει το όνομά του.

import os
os.rename('./testdir/a.jpg', './testdir/a_000.jpg')

Στη συνέχεια, το a.jpg θα μετονομαστεί σε a_000.jpg.

Δημιουργία μηδενικών διαδοχικών αριθμών με str.format()

Για παράδειγμα, όταν προσθέτουμε διαδοχικούς αριθμούς σε δεκάδες αρχεία, θέλουμε να χρησιμοποιούμε «00» ή «11» αντί για «0» ή «1». Αν θέλετε να συμπληρώσετε τα μηδενικά με αυτόν τον τρόπο, χρησιμοποιήστε τη μέθοδο str.format().

str.format(args,*kwargs)
Εκτελεί λειτουργίες μορφοποίησης συμβολοσειρών. Η συμβολοσειρά που καλεί αυτή τη μέθοδο μπορεί να περιέχει κανονικούς χαρακτήρες ή πεδία αντικατάστασης που χωρίζονται με {}.Built-in Types — Python 3.10.0 Documentation

Σύνταξη των συμβολοσειρών προδιαγραφής μορφής
Η συμβολοσειρά μορφοποίησης περιέχει το «πεδίο αντικατάστασης» που περικλείεται σε αγκύλες {}.

Η σύνταξη του πεδίου αντικατάστασης έχει ως εξής:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Με απλούστερους όρους, το πεδίο αντικατάστασης αρχίζει με field_name, το οποίο προκαλεί τη μορφοποίηση της τιμής του καθορισμένου αντικειμένου και την εισαγωγή της στην έξοδο αντί του πεδίου αντικατάστασης. Μετά το field_name, το πεδίο μετατροπής μπορεί να ακολουθείται από ένα θαυμαστικό '! Μετά το field_name, το πεδίο μετατροπής μπορεί να ακολουθείται από ένα θαυμαστικό '! Το format_spec μπορεί να γραφτεί με άνω και κάτω τελεία ':' στο τέλος. Αυτό καθορίζει τη μη προεπιλεγμένη μορφή της τιμής που πρόκειται να αντικατασταθεί.
string — Common string operations — Python 3.10.0 Documentation

Αν θέλετε να το γεμίσετε με 0 προς το παρόν, κάντε τα εξής.

# 3を2桁でゼロ埋め
print('{0:02d}'.format(3))
# => 03

# Fill in the zeros with three and four digits for 4 and 6, respectively.
print('{0:03d}, {1:04d}'.format(4, 6))
# => 004, 0006

Παράδειγμα κώδικα για την προσθήκη ενός string\διαδοχικού αριθμού πριν από ένα αρχείο

Πρώτον, λάβετε το όνομα του αρχείου με την os.path.basename(). Στη συνέχεια, προσθέστε ένα αλφαριθμητικό ή έναν αύξοντα αριθμό μπροστά από το όνομα του αρχείου και ενώστε το με την αρχική διαδρομή με την os.path.join().

Το ακόλουθο παράδειγμα προσθέτει το img_ στο μπροστινό μέρος όλων των ονομάτων αρχείων.

import os
import glob

path = "./testdir"
files = glob.glob(path + '/*')

for f in files:
    os.rename(f, os.path.join(path, 'img_' + os.path.basename(f)))

Το αποτέλεσμα έχει ως εξής.

.
└── testdir
    ├── img_a.jpg
    ├── img_b.jpg
    ├── img_c.jpg
    ├── img_d.jpg
    └── img_e.jpg

Αν θέλετε να προσθέσετε διαδοχικούς αριθμούς, αλλάξτε την εντολή for σε κάτι τέτοιο: enumerate() για να λάβετε τους αριθμούς μετρημένους κατά σειρά από το 0. Σε αυτή την περίπτωση, ο αριθμός συμπληρώνεται με τρία ψηφία.

for i, f in enumerate(files):
    os.rename(f, os.path.join(path, '{0:03d}'.format(i) +
                              '_' + os.path.basename(f)))

Ιδού το αποτέλεσμα.

.
└── testdir
    ├── 000_a.jpg
    ├── 001_b.jpg
    ├── 002_c.jpg
    ├── 003_d.jpg
    └── 004_e.jpg

Αν θέλετε να ξεκινήσετε με 1 αντί για 0, ορίστε το δεύτερο όρισμα του enumerate σε 1.

for i, f in enumerate(files, 1):
    os.rename(f, os.path.join(path, '{0:03d}'.format(i) +
                              '_' + os.path.basename(f)))

Έχει ως εξής.

.
└── testdir
    ├── 001_a.jpg
    ├── 002_b.jpg
    ├── 003_c.jpg
    ├── 004_d.jpg
    └── 005_e.jpg

Παράδειγμα κώδικα για την προσθήκη ενός string\διαδοχικού αριθμού μετά από ένα αρχείο

Χρησιμοποιήστε την os.path.splitext() για να χωρίσετε το αρχείο σε επέκταση και διαδρομή ρίζας και, στη συνέχεια, προσθέστε συμβολοσειρές ή διαδοχικούς αριθμούς στη διαδρομή ρίζας. Στο ακόλουθο παράδειγμα, το _img προστίθεται μετά από όλα τα ονόματα αρχείων.

import os
import glob

files = glob.glob('./testdir/*')

for f in files:
    ftitle, fext = os.path.splitext(f)
    os.rename(f, ftitle + '_img' + fext)

Το αποτέλεσμα είναι το εξής.

.
└── testdir
    ├── a_img.jpg
    ├── b_img.jpg
    ├── c_img.jpg
    ├── d_img.jpg
    └── e_img.jpg

Όπως και με την προσθήκη ενός string\διαδοχικού αριθμού πριν από ένα αρχείο, αλλάξτε την εντολή for όταν προσθέτετε έναν διαδοχικό αριθμό.

for i, f in enumerate(files):
    ftitle, fext = os.path.splitext(f)
    os.rename(f, ftitle + '_' + '{0:03d}'.format(i) + fext)
.
└── testdir
    ├── a_000.jpg
    ├── b_001.jpg
    ├── c_002.jpg
    ├── d_003.jpg
    └── e_004.jpg
Copied title and URL