首先,顯然你使用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 ...),那麼你會在返回的列表glob
的paths2
中找到該文件。當然,保證一個目錄只包含子目錄是有問題的,而不是一個好主意,根本不是。您可以通過os.path.isdir
注意到一些測試的目錄,你使用lambda
與filter
幫助過濾掉沒有在你第一次調用包含10
到filter
,有些東西你可以用glob
本身實現任意字符串:
glob.glob('C:/my/store/path/*10*')
現在的任何文件或C的子目錄:包含在其名稱中10 /我/存儲/路徑將在glob
函數的返回列表收集。
第三,zip
截斷到其參數列表中最短的可迭代。換句話說,如果你想移動每路徑paths
到每路徑paths2
,你需要len(paths) == len(paths2)
所以在paths
每個文件或目錄有directory
在paths2
被移動到。
第四,您錯過了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)
*上面我提到的一些以前的問題適用於此代碼。
現在你已經完成了閱讀這個答案的漫長的馬拉松比賽,你想要做些什麼來改進你的代碼呢?如果您仍然發現某些含糊不清的情況,我會很樂意提供幫助。
祝你好運:)
什麼是試圖用你的lambda函數來實現?您可以立即從'glob'函數過濾路徑。 – direprobs
@direprobs這是沒有問題的問題在這裏'shutil.move(i,j)' –