2017-05-05 215 views
0

您好,我想將一些文件夾列表中的多個文件夾移動或複製到其他文件夾列表中。我使用globshutil庫進行此項工作。使用python將文件夾從文件夾列表移動到其他文件夾列表

首先我創建了一個文件夾列表:

import glob 

#paths from source folder 
sourcepath='C:/my/store/path/*' 
paths = glob.glob(sourcepath) 
my_file='10' 
selected_path = filter(lambda x: my_file in x, paths) 
#paths from destination folder 
destpath='C:/my/store/path/*' 
paths2 = glob.glob(destpath) 
my_file1='20' 
selected_path1 = filter(lambda x: my_file1 in x, paths2) 

,現在我從路上的兩個列表(selected_pa​​th,selected_pa​​th1)

現在我想電影或從第一清單(selected_path)複製文件夾第二個列表(selected_path1

finaly我試試這個代碼,以移動文件夾,但沒有成功:

import shutil 
for I,j in zip(selected_path,selected_path1) 
    shutil.move(i, j) 

但不能工作,任何ide如何做我的代碼工作?

+0

什麼是試圖用你的lambda函數來實現?您可以立即從'glob'函數過濾路徑。 – direprobs

+0

@direprobs這是沒有問題的問題在這裏'shutil.move(i,j)' –

回答

1

首先,顯然你使用lambda沒有用,glob函數可以執行這個過濾。這就是glob真正做到的,所以你基本上會拋棄更多不必要的函數調用,這在性能方面相當昂貴。

看看下面這個例子,等同於你:

import glob 

# Find all .py files 
sourcepath= 'C:/my/store/path/*.py' 
paths = glob.glob(sourcepath) 

# Find files that end with 'codes' 
destpath= 'C:/my/store/path/*codes' 
paths2 = glob.glob(destpath) 

二,第二glob函數調用可能會或可能不會目錄列表來移動你的目錄/文件。這使得您的代碼依賴於C:/ my/store/path contains. That is, you must guarantee that 'C:/my/store/path必須僅包含目錄而不包含文件,因此glob將僅返回要在shutil.move中使用的目錄。如果用戶以後添加了不是文件夾的文件到C:/ my/store/path,而這個文件名以'codes'結尾,並且沒有指定任何擴展名(例如,codes.txt,codes.py ...),那麼你會在返回的列表globpaths2中找到該文件。當然,保證一個目錄只包含子目錄是有問題的,而不是一個好主意,根本不是。您可以通過os.path.isdir

注意到一些測試的目錄,你使用lambdafilter幫助過濾掉沒有在你第一次調用包含10filter,有些東西你可以用glob本身實現任意字符串:

glob.glob('C:/my/store/path/*10*') 

現在的任何文件或C的子目錄:包含在其名稱中10 /我/存儲/路徑將在glob函數的返回列表收集。

第三,zip截斷到其參數列表中最短的可迭代。換句話說,如果你想移動路徑paths路徑paths2,你需要len(paths) == len(paths2)所以在paths每個文件或目錄有directorypaths2被移動到。

第四,您錯過了for循環的分號,並且在呼叫shutil.move時,您使用了i而不是I。Python是一種區分大小寫的語言,而I大寫是不完全一樣的i小寫:

import shutil 
for I,j in zip(selected_path,selected_path1)   # missing : 
    shutil.move(i, j)         # i not I 

更正代碼:

import shutil 
for I,j in zip(selected_path,selected_path1)   # missing : 
    shutil.move(I, j)         # i not I 

據推測,paths2只包含的C子目錄:/我的/ store/path目錄下,這是一個更好的方法來寫你的代碼,但絕對是不是最好:

import glob 

#paths from source folder 
sourcepath='C:/my/store/path/*10*' 
paths = glob.glob(sourcepath) 

#paths from destination folder 
destpath='C:/my/store/path/*20*' 
paths2 = glob.glob(destpath) 

import shutil 
for i,j in zip(paths,paths2): 
    shutil.move(i, j) 

*上面我提到的一些以前的問題適用於此代碼。

現在你已經完成了閱讀這個答案的漫長的馬拉松比賽,你想要做些什麼來改進你的代碼呢?如果您仍然發現某些含糊不清的情況,我會很樂意提供幫助。

祝你好運:)

+0

你是完整的正確的工作,但如果我使用'shutil.copy'而不是'shutil.move'我把' IOError:[Errno 13] Permission denied:'任何想法爲什麼 ? –

+0

@jessie jes'shutil.move'實際上會引發同樣的異常,如果您嘗試移動文件而沒有您的操作系統的正確權限。由於您嘗試執行沒有正確權限的任務,因此會出現「權限被拒絕」異常。以管理員身份運行cmd可能是一個解決方案。 – direprobs

+0

thx你尋求幫助 –

相關問題