2017-07-07 3 views
3

J'ai un script qui:fichiers Python déplacer de façon inattendue avec os.rename

  1. boucle dans tous les fichiers dans un répertoire + ses sous-répertoires
  2. CRÉE dossier pour chaque année unique dans la liste des fichiers
  3. Déplace les fichiers dans leur dossier respectif années
  4. Renomme les fichiers en fonction de l'horodatage + numéro unique.

Lorsque j'exécute les pièces 1-3 uniquement, les fichiers sont correctement déplacés dans les dossiers.

Lorsque j'exécute les parties 1 à 4 (y compris la partie os.rename), il renomme les fichiers APRÈS les replacer dans le répertoire parent.

structure de fichier de démarrage:

parent_folder 
     --> file.txt modified 01-21-2012 
     --> file2.txt modified 09-30-2013 
     --> file3.txt modified 06-21-2017 

Résultat attendu:

parent_folder 
--> '2012' 
     --> 2012-01-21-1.txt 
--> '2013' 
     --> 2013-09-30-2.txt 
--> '2017' 
     --> 2017-06-21-3.txt 

Résultat réel:

parent_folder 
--> '2012' 
--> '2013' 
--> '2017' 
--> '2012-01-21-1.txt' 
--> '2013-09-30-2.txt' 
--> '2017-06-21-4.txt' 

Comme vous pouvez le voir, le renomme les fichiers mais les déplacés hors de leur Dossiers. Pourquoi ça fait ça?

Mon code (j'ai inséré des instructions d'impression pour l'enregistrement):

import os, datetime, sys, shutil 

#PART 1 : Change to the inputted directory 
#=============================== 

# This is the directory I will work on. 
p = 'ENTER_FOLDER_PATH_HERE' 
print('This is the directory that will be organized:') 
print(os.getcwd()) 
if os.path.isdir(p): # check if directory exists 
    print("Step 1: Changing directory") 
    os.chdir(p) 

#PART 2 : Make a folder for each unique year 
#=========================================== 
    fileNames = next(os.walk(os.getcwd()))[2] # list files, excluding subdirectories 
    f = {} 
    filename = [] 
    dates = [] 

    # Loop through each file and grab the unique year. 
    # Store the file (key) and its modified year (value) into dictionary 'f'. 
    for name in fileNames: 
     f[name] = datetime.datetime.fromtimestamp(os.path.getmtime(name)).strftime("%Y") 
     dates = list(set(f.values())) 

    # Create the list of unique folders from the dictionary. 
    print("Step 2: Creating the following folders:\n", dates) 
    print('\n') 
    [os.mkdir(folder) for folder in dates] 


#PART 3: Move all files to their respective folders based on modified year. 
#========================================================================== 
    if sys.platform == 'Windows': 
     print("Step 3: moving files...") 
     [shutil.move(key, os.getcwd() + '\\' + value) for key, value in f.items()] 
    elif sys.platform == 'darwin': 
     print("Step 3: moving files...") 
     [shutil.move(key, os.getcwd() + '//' + value) for key, value in f.items()] 
    else: 
     print("Sorry, this script is not supported in your OS.") 
else: 
    print("Oops, seems like that directory doesn't exist. Please try again.") 


#PART 4: Rename the files 
#========================================================================== 
# Get each file in directory and renames it to its modified date, Y-M-D format 
count=1 
for root, dir, files in os.walk(p): 
    for file in files: 
     if not file.startswith('.'): # ignore hidden files 
      filePath = os.path.join(root,file) 
      ext = os.path.splitext(filePath)[1] 
      print("File number: ", count, file, ext) 
      print('\n') 
      os.rename(filePath, datetime.datetime.fromtimestamp(os.path.getmtime(filePath)).strftime("%Y-%m-%d") + '-' + str(count) + ext) 
     count += 1 
     print(filePath) 

Journaux:.

This is the directory that will be organized: 
TEST_PATH 
Step 1: Changing directory 
Step 2: Creating the following folders: 
['2013', '2012', '2017'] 


Step 3: moving files... 
File number: 1 2012-01-21-1.jpg TEST_PATH/2012/2012-01-21-1.jpg 
TEST_PATH//2012/2012-01-21-1.jpg 

File number: 2 2013-09-30-2.jpg TEST_PATH/2013/2013-09-30-2.jpg 
TEST_PATH/2013/2013-09-30-2.jpg 
TEST_PATH/2013/2013-09-30-2.jpg 

File number: 4 June 21 2017.txt TEST_PATH/2017/June 21 2017.txt 
TEST_PATH/2017/June 21 2017.txt 

Répondre

1

Il déplace le fichier, en raison du répertoire de travail que vous êtes dans I gues cela fonctionne juste comme mv commande. Le fichier résultant, après raname, sera placé dans un chemin spécifié par le second argument de la fonction os.rename, par rapport à cwd. Si vous voulez que cela fonctionne correctement, vous devez spécifier le chemin relatif avec le nouveau nom de fichier.

Btw. vous pouvez faire les étapes 3 & 4 à la fois de cette façon.

+0

Ça a beaucoup de sens maintenant - ça marche, merci! – tkim90