Un dossier zip contient quelques fichiers pdf et leurs noms sont au format October 1, 1970.pdf
, March 27, 1995.pdf
etc. Je souhaite changer le format de chaque fichier en YYYY-MM-DD
en python
import datetime
date1 = "/Users/akshitarora/Downloads/Akshitpythoncole/"
datetime = datetime.datetime.strptime(date1, "%m-%d-%Y")
print(datetime.strftime("%m-%d-%Y"))
Erreur:
ValueError: time data '/Users/akshitarora/Downloads/Akshitpythoncole/'
does not match format '%m-%d-%Y'
1 réponse
Vous avez deux erreurs.
Premièrement: vous avez un nom de dossier mais il n'obtiendra pas les noms de fichiers du dossier. Vous devez utiliser os.listdir()
ou glob.glob(...)
pour l'obtenir.
import os
folder = "/Users/akshitarora/Downloads/Akshitpythoncole/"
filenames = os.listdir(folder)
Et ensuite, vous devez utiliser la boucle pour changer chaque nom de fichier séparément.
Deuxièmement: la date October 1, 1970
ne correspond pas au format %m-%d-%Y
mais à %B %d, %Y
.
Et quand vous utiliserez strptime(name, "%B %d, %Y")
, n'oubliez pas de supprimer l'extension de fichier. OU utilisez l'extension au format "%B %d, %Y.pdf"
. Vous pouvez également utiliser l'extension lorsque vous formatez le nouveau nom "%m-%d-%Y.pdf"
Lorsque vous changez de nom - using os.rename()
- vous devez vous rappeler que vous devez ajouter un dossier au nom de fichier pour créer le chemin d'accès complet - os.path.join(folder, filename)
Je ne l'ai pas testé (car je n'ai pas ce dossier et ces fichiers) mais ça devrait marcher
import os
import datetime
folder = "/Users/akshitarora/Downloads/Akshitpythoncole/"
filenames = os.listdir(folder)
#filenames = ['October 1, 1970.pdf', 'March 27, 1995.pdf']
for name in filenames:
if name.endswith('.pdf'):
dt = datetime.datetime.strptime(name, "%B %d, %Y.pdf")
new_name = dt.strftime("%m-%d-%Y.pdf")
print(new_name)
old_path = os.path.join(folder, name)
new_path = os.path.join(folder, new_name)
BTW: Ce n'est pas une bonne idée d'utiliser une variable avec le nom datetime
parce que vous utilisez un module avec le même nom datetime
et en utilisant une variable avec ce nom, vous n'avez pas accès au module.
EDIT: Problème avec les noms "1er octobre 1972 A.pdf", "1er octobre 1972 B.pdf"
Je vérifie si le nom comporte 3 espaces, puis je le divise sur le dernier espace pour obtenir la liste des pièces ['October 1, 1972', 'A.pdf']
. Maintenant, je peux convertir la date dans la première partie et la rejoindre plus tard avec la deuxième partie pour créer le nom 10-01-1972 A.pdf
import datetime
filenames = ['October 1, 1972 A.pdf', 'October 1, 1972 B.pdf', 'October 1, 1972.pdf']
for name in filenames:
if name.endswith('.pdf'):
if name.count(' ') == 3:
parts = name.rsplit(' ', 1) # split on last space
print(' parts:', parts)
dt = datetime.datetime.strptime(parts[0], "%B %d, %Y")
parts[0] = dt.strftime("%m-%d-%Y")
new_name = ' '.join(parts)
else:
dt = datetime.datetime.strptime(name, "%B %d, %Y.pdf")
new_name = dt.strftime("%m-%d-%Y.pdf")
print(name, '->', new_name)
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.