2014-04-23 16 views
5

Ho scritto uno script per spostare i file video da una directory a un'altra, inoltre cercherà sottodirectory usando os.walk. tuttavia, se lo script trova un file video, sposta solo il file e non la cartella contenente. Ho aggiunto un'istruzione if per verificare se la cartella contenente è diversa dalla cartella di ricerca originale.Python: utilizzo di shutil.move o os.rename per spostare le cartelle

Non riesco a trovare il codice per spostare (o rinominare?) Effettivamente la cartella e il file in una directory diversa. Ho letto/guardato molto sui file in movimento e ci sono molte informazioni su questo, ma non trovo nulla per spostare le cartelle.

Ho provato a usare shutil.move e os.rename e ottengo un errore entrambe le volte. quando provo a cercare il problema ottengo molti risultati su come spostare i file o su come modificare la directory di lavoro corrente di python.

qualsiasi consiglio (anche come esprimere la ricerca su google per descrivere con precisione come trovare un tutorial sull'argomento) sarebbe molto apprezzato. è il mio primo vero programma Python del mondo reale e ho imparato molto, ma questo ultimo passo mi sta rovinando!

EDIT: quando si cerca di utilizzare os.rename(src_file, dst_file) ho l'errore WindowsError: error 3 The system cannot find the path specified.

quando si cerca shutil.move(src_file, dst_file) ottengo ioerror errno 2 no such file or directory "H:\\Moviesfrom download...\OneOfTheVideoFilesNotInParentFolder cioè la cartella e il file ha bisogno di muoversi.

grazie.

ps come ho detto è la mia prima sceneggiatura al di fuori dell'accademia del codice, quindi qualsiasi suggerimento casuale sarebbe anche apprezzato.

import os 
import shutil 
import time 

movietypes = ('.3gp', '.wmv', '.asf', '.avi', '.flv', '.mov', '.mp4', '.ogm', '.mkv', 
'. mpg', '.mpg', '.nsc', '.nsv', '.nut', '.a52', '.tta', '.wav', '.ram', '.asf', 
'.wmv', '. ogg', '.mka', '.vid', '.lac', '.aac', '.dts', '.tac', 
'.dts', '.mbv') 

filewrite = open('H:\\Movies from download folder\\Logs\\logstest.txt', 'w') 
dir_src = "C:\\Users\\Jeremy\\Downloads\\" 
dir_dst = "H:\\Movies from download folder\\" 

for root, dirs, files in os.walk(dir_src): 
    for file in files: 
     if file.endswith(movietypes) == True: 
      filestr = str(file) 
      locationoffoundfile = os.path.realpath(os.path.join(root,filestr)) 
      folderitwasin = locationoffoundfile.replace(dir_src,'') 
      folderitwasin = folderitwasin.replace(filestr,'') 
      pathofdir = os.path.realpath(root) + "\\" 
      if pathofdir != dir_src: 
       src_file = locationoffoundfile 
       dst_file = dir_dst + folderitwasin + filestr 
       os.rename(src_file, dst_file) #****This line is the line im having issues with*** 
       print src_file 
       print dst_file 
       filewrite.write(file + " " + "needs to have dir and file moved Moved!" + '\n') 
      else: 
       src_file = os.path.join(dir_src, file) 
       dst_file = os.path.join(dir_dst, file) 
       print src_file 
       print dst_file 
       shutil.move(src_file, dst_file) 
       filewrite.write(os.path.dirname(file) + '\n') 
       filewrite.write(file + " " + "needs to have file moved Moved!" + '\n') 
filewrite.close() 
+2

_ "Ho provato a usare shutil.move e os.rename e ottengo un errore entrambe le volte." _ Che cosa dice l'errore? – Kevin

+0

ho aggiornato il mio post originale con i dettagli dell'errore. – user3560858

risposta

3

Sembra che stiate spostando solo i file, senza fare nulla sulle cartelle. Quindi, se si tenta di spostare

C:\Users\Jeremy\Downloads\anime\pokemon.avi 

a

H:\Movies from download folder\anime\pokemon.avi 

fallirà perché non c'è anime directory sul H:\ ancora.

Prima di iterare tramite files, iterare attraverso dirs per assicurarsi che la directory esista alla destinazione, creando se necessario.

for root, dirs, files in os.walk(dir_src): 
    for dir in dirs: 
     dest_dir = os.path.join(dir_dst, dir) 
     if not os.path.isdir(dest_dir): 
      os.mkdir(dest_dir) 
    for file in files: 
    #rest of code goes here as usual... 
+0

Grazie! sta funzionando! ho usato: se non os.path.isdir (dir_dst + folderitwasin): os.mkdir (dir_dst + folderitwasin) shutil.move (src_file, dst_file) Ho ancora bisogno di cancellare la vecchia directory però, sto lavorando su quello ora! – user3560858

0

in quanto questi sono i percorsi di MS Windows utilizzare le barre, invece, e dichiarano percorso come string literal; per esempio.

dir_dst = r"H:/Movies from download folder/" 
+0

Grazie. l'ho cambiato, ma ora ho problemi con il comando os.path.realpath (os.path.join (root, filestr)). restituisce C: \\ users \\ jeremy \\ downloads \\ ... darò un'occhiata e vedrò se dovrei usare un comando diverso. – user3560858

+0

guarda il commento aggiornato – gts

+0

Non penso che la direzione della barra faccia la differenza. Funziona sempre per me in entrambi i casi. – Kevin

Problemi correlati