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'
0
Kabir 4 nov. 2019 à 00:26

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)
0
furas 5 nov. 2019 à 02:08