2016-11-03 2 views
0

Je suis novice en programmation et je travaille sur une tâche de création de script en utilisant Python pour détecter les fichiers d'un dossier créé ou modifié au cours des dernières 24 heures, puis déplacez ces fichiers dans un répertoire différent.Déplacement de fichiers spécifiques de plage de temps en Python

J'ai écrit un code qui imprime la date de création et de modification des fichiers, dans une fonction qui trie également les anciens fichiers/modifiés il y a plus de 24 heures. Mais je me bats avec la création d'un script qui prend ces fichiers spécifiques et les transfère dans un nouveau dossier. Ceci est la première partie de mon code:

import os,time 
    import datetime 
    import shutil 


    now = dt.datetime.now() 
    ago = now-dt.timedelta(hours=24) 
    strftime = "%H:%M %m/%d/%Y" 
    created = 'C:\\Users\\Jacquelin\e\Desktop\\created' 
    dest = 'C:\\Users\\Jacqueline\\Desktop\\dest' 


    for root, dirs,files in os.walk(created): 
     for fname in files: 
      path = os.path.join(root, fname) 
      st = os.stat(path)  
      mtime = dt.datetime.fromtimestamp(st.st_mtime) 
      if mtime > ago: 
       print "True: ", fname, " at ", mtime.strftime("%H:%M %m/%d/%Y") 
      else: 
       print False 

    for fname in os.listdir(created): 
     if mtime > ago:     
      shutil.move(path, dest) 
      print "moved to dest", fname 

J'utilise shutil.move pour transférer les fichiers, et ont essayé un million things-- mais ne peut pas comprendre! Je travaille également sur les transformer en fonctions pour simplifier les choses. Jusqu'à présent, voici ce que j'ai:

def find_info():         #this first func. works fine. 
     for root, dirs, files in os.walk(created): 
     for fname in files: 
      path = os.path.join(root, fname)           
      st = os.stat(path)  
      mtime = dt.datetime.fromtimestamp(st.st_mtime)       
     if mtime > ago: 
      print True 
     else: 
      print False 

Pour la fonction « move », je me sens comme cela est la bonne idée mais, ne connaissant pas les variables à passer, je l'ai laissé les parenthèses vides. Et que renvoie une longue liste de booléens fous. Alors.

def move(): 
     for fname in os.listdir(created): 
      path = os.path.join(root, fname) 
      if find_info(fname) == True:     
       shutil.move(path, dest) 
       print "moved to dest", fname 

    print find_info()       #variable? is one even needed? 
    print move()        #variable???? 

    print os.listdir(dest) 
    print os.listdir(created) 

Je ne sais pas quelle (s) variable (s) passer dans les fonctions. Ensuite, j'imprime les répertoires pour voir si les fichiers ont bien été transférés. Les choses damnées ne bougeront pas.

Merci!

+0

Pourriez-vous expliquer comment vous utilisez 'shutil.move' et qu'est-ce qui ne va pas? Messages d'erreur, etc. Notez également que le chemin avec des barres obliques inverses peut être interprété incorrectement car le backslash a une signification spéciale (comme dans \ n), vous devez donc y échapper '" c: \\ Users \\ ... "' ou (mieux) '' os .path.join'. –

+0

Je viens de changer mon code, et je le mettrai ci-dessus avec le message original; Avec shutil.move, ça ne bouge pas les fichiers! Je demande au programme d'imprimer les répertoires d'origine et de destination, mais aucun transfert n'a eu lieu. – nikkiy

Répondre

0

Vous êtes presque là. Appelez simplement la fonction shutil.move après avoir détecté que le fichier en question peut être déplacé (c'est-à-dire avant/après/au lieu de print("True: ", fname, " at ", mtime.strftime("%H:%M %m/%d/%Y"))). Quelque chose comme ça fonctionne:

import os,time 
import datetime 
import shutil 

import datetime as dt 

now = dt.datetime.now() 
ago = now-dt.timedelta(hours=24) 
strftime = "%H:%M %m/%d/%Y" 
created = 'here' 
dest = 'there' 

for root, dirs,files in os.walk(created): 
    for fname in files: 
     path = os.path.join(root, fname) 
     st = os.stat(path)  
     mtime = dt.datetime.fromtimestamp(st.st_mtime) 
     if mtime > ago: 
      print("True: ", fname, " at ", mtime.strftime("%H:%M %m/%d/%Y")) 
      shutil.move(path, dest) 
      # this is actual move 

L'extrait suivant est tout faux et pas nécessaire:

for fname in os.listdir(created): 
    if mtime > ago:     
     shutil.move(path, dest) 
     print "moved to dest", fname 

Ici mtime, path et dest ne dépendent pas de la variable de la boucle fname, il est donc pas clair pourquoi nous avons besoin de boucle ici et quel est le comportement prévu de ce fragment.

Notez que que votre fonction find_info() (que nous ne avons pas besoin en réalité non plus) ne retourne rien: cette fonction imprimeTrue ou False au lieu de retour il.

+0

Oh mon Dieu, c'est magique. Merci beaucoup! Donc je n'ai pas vraiment besoin de créer de fonctions? Je peux juste utiliser pour les boucles, et l'appeler un jour? – nikkiy

+0

Vous avez besoin de fonctions si vous avez une partie isolée de votre logique qui résout un sous-problème particulier de votre problème et qui peut potentiellement être utilisé plusieurs fois dans différentes parties du programme. Il n'y a pas besoin de créer des fonctions uniquement pour créer des fonctions. –