2014-04-23 15 views
5

Tôi đã viết một kịch bản để di chuyển các tệp video từ một thư mục này sang một thư mục khác, nó cũng sẽ tìm kiếm các thư mục con bằng cách sử dụng os.walk. tuy nhiên, nếu tập lệnh tìm thấy tệp video, tập lệnh sẽ chỉ di chuyển tệp và không di chuyển tệp chứa. tôi đã thêm câu lệnh if để kiểm tra xem thư mục chứa có khác với thư mục tìm kiếm gốc hay không.Python: Sử dụng shutil.move hoặc os.rename để di chuyển các thư mục

tôi không thể tìm thấy mã để thực sự di chuyển (hoặc đổi tên?) Thư mục và tệp vào một thư mục khác. tôi đã đọc/xem rất nhiều về di chuyển các tập tin và có rất nhiều thông tin về điều đó, nhưng tôi không thể tìm thấy bất cứ điều gì để di chuyển thư mục.

tôi đã thử sử dụng shutil.move và os.rename và tôi gặp lỗi cả hai lần. khi tôi thử và tìm kiếm sự cố, tôi nhận được rất nhiều kết quả về cách di chuyển tệp hoặc cách thay đổi thư mục làm việc hiện tại của python.

bất kỳ lời khuyên nào (kể cả cách tìm kiếm cụm từ tìm kiếm google để exactatly mô tả cách tìm hướng dẫn về chủ đề) sẽ thực sự được đánh giá cao. đó là chương trình python thế giới thực đầu tiên của tôi và tôi đã học được rất nhiều nhưng bước cuối cùng này là mặc tôi xuống!

EDIT: khi cố gắng sử dụng os.rename(src_file, dst_file) tôi nhận được lỗi WindowsError: error 3 The system cannot find the path specified.

khi cố gắng shutil.move(src_file, dst_file) tôi nhận được ioerror errno 2 no such file or directory "H:\\Moviesfrom download...\OneOfTheVideoFilesNotInParentFolder tức là thư mục và tập tin cần di chuyển.

cảm ơn.

ps như tôi đã nói đó là tập lệnh đầu tiên của tôi bên ngoài học viện mã nên mọi đề xuất ngẫu nhiên cũng sẽ được đánh giá cao.

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

_ "tôi đã thử sử dụng shutil.move và os.rename và tôi gặp lỗi cả hai lần." _ Lỗi nói gì? – Kevin

+0

tôi đã cập nhật bài đăng gốc của mình với các chi tiết về lỗi. – user3560858

Trả lời

3

Có vẻ như bạn chỉ đang di chuyển các tệp mà không làm bất kỳ điều gì về các thư mục. Vì vậy, nếu bạn cố gắng để di chuyển

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

để

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

nó sẽ thất bại vì không có anime thư mục trên H:\ được nêu ra.

Trước khi lặp qua files, hãy lặp lại qua dirs để đảm bảo rằng thư mục tồn tại ở đích của bạn, tạo thư mục đó nếu cần.

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

Cảm ơn! nó hoạt động! tôi đã sử dụng: nếu không phải là os.path.isdir (dir_dst + folderitwasin): os.mkdir (dir_dst + folderitwasin) tắt máy.di chuyển (src_file, dst_file) Tôi vẫn cần phải xóa thư mục cũ mặc dù, im làm việc trên đó ngay bây giờ! – user3560858

0

Như đây là MS Windows đường dẫn sử dụng dấu gạch chéo thay vào đó và tuyên bố con đường như một string literal; ví dụ.

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

Cảm ơn. tôi đã thay đổi nhưng bây giờ tôi có vấn đề với lệnh os.path.realpath (os.path.join (root, filestr)). nó trả về C: \\ users \\ jeremy \\ downloads \\ ... tôi sẽ có một cái nhìn và xem nếu tôi nên sử dụng một lệnh khác nhau. – user3560858

+0

xem nhận xét cập nhật – gts

+0

Tôi không nghĩ rằng dấu gạch chéo tạo nên sự khác biệt. Nó luôn luôn làm việc cho tôi một trong hai cách. – Kevin

Các vấn đề liên quan