2014-04-23 8 views
5

Napisałem skrypt do przenoszenia plików wideo z jednego katalogu do drugiego, a także przeszukiwania podkatalogów za pomocą os.walk. jeśli jednak skrypt znajdzie plik wideo, przeniesie on tylko ten plik, a nie folder zawierający. Dodałem instrukcję if, aby sprawdzić, czy folder zawierający różni się od oryginalnego folderu wyszukiwania.Python: Używanie shutil.move lub os.rename do przenoszenia folderów

Nie mogę znaleźć kodu, aby faktycznie przenieść (lub zmienić nazwę?) Folder i plik do innego katalogu. dużo czytałem/oglądałem na przenoszeniu plików i jest wiele informacji na ten temat, ale nie mogę znaleźć niczego do przenoszenia folderów.

Próbowałem używać shutil.move i os.rename i otrzymuję błąd oba razy. kiedy próbuję i szukam problemu, otrzymuję wiele wyników dotyczących przenoszenia plików lub zmiany bieżącego katalogu roboczego Pythona.

każda rada (a nawet jak nazywać wyszukiwarkę Google dokładnym opisem, jak znaleźć tutorial na ten temat) byłaby naprawdę doceniana. to mój pierwszy prawdziwy program Pythona i wiele się nauczyłem, ale ten ostatni krok mnie zmęczy!

EDIT: gdy próbuje użyć os.rename(src_file, dst_file) pojawia się błąd WindowsError: error 3 The system cannot find the path specified.

podczas próby shutil.move(src_file, dst_file) ja dostać ioerror errno 2 no such file or directory "H:\\Moviesfrom download...\OneOfTheVideoFilesNotInParentFolder czyli folderu i pliku musi się poruszać.

dzięki.

ps jak powiedziałem, że to mój pierwszy skrypt poza akademią kodu, więc wszelkie przypadkowe sugestie będą również mile widziane.

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

_ "Próbowałem używać shutil.move i os.rename i otrzymuję błąd dwa razy." _ Co mówi ten błąd? – Kevin

+0

Mam zaktualizowany mój oryginalny wpis ze szczegółami błędu. – user3560858

Odpowiedz

3

Wygląda na to, że tylko przenosisz pliki, nie robiąc nic na temat folderów. Więc jeśli chcesz przenieść

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

do

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

zakończy się niepowodzeniem, ponieważ nie ma anime katalog na H:\ jeszcze.

Przed wykonaniem kolejnych iteracji przez files należy wykonać iterację poprzez dirs, aby upewnić się, że katalog istnieje w miejscu docelowym, tworząc go w razie potrzeby.

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

Dzięki! to działa! użyłem: jeśli nie os.path.isdir (dir_dst + folderitwasin): os.mkdir (dir_dst + folderitwasin) shutil.move (src_file, dst_file) Nadal jednak muszę usunąć stary katalog, pracuję nad tym teraz! – user3560858

0

Ponieważ są ścieżki MS Windows używać zamiast ukośniki i zadeklarować ścieżkę jako string literal; na przykład

+0

Dzięki. zmieniłem to, ale teraz mam problemy z poleceniem os.path.realpath (os.path.join (root, filestr)). zwraca C: \\ users \\ jeremy \\ downloads \\ ... zobaczę, czy powinienem użyć innego polecenia. – user3560858

+0

Spójrz na zaktualizowany komentarz – gts

+0

Nie sądzę, że kierunek ukośnika robi różnicę. To zawsze działa dla mnie w obu kierunkach. – Kevin

Powiązane problemy