2017-02-27 92 views
0
import os 
import shutil 
os.chdir('C:\\') 

dir_src = ('C:\\Users\\Tibi\\Desktop\\New Folder\\New Folder') 
dir_dst = ('D:\\test') 


for folder in os.walk(dir_src): 
    print(folder) 
    for filename in os.listdir(dir_src): 
     if filename.endswith('.CR2'): 
      shutil.copy(dir_src + filename, dir_dst) 
     print(filename) 

請注意,導致它退出的文件是我想要複製到測試文件夾的文件之一。我試過使用其他文件類型,他們也不工作。爲什麼我不能使用shutil來複制.CR2文件?

輸出:

Traceback (most recent call last): 
    File "copyfiletree.py", line 14, in <module> 
    shutil.copy(dir_src + filename, dir_dst) 
    File "C:\Users\Tibi\Anaconda3\lib\shutil.py", line 235, in copy 
    copyfile(src, dst, follow_symlinks=follow_symlinks) 
    File "C:\Users\Tibi\Anaconda3\lib\shutil.py", line 114, in copyfile 
    with open(src, 'rb') as fsrc: 
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\New FolderIMG_5221.CR2' 

我想我應該提到我的計算機感染了勒索孢(但是,這些文件是不加密)。

新的代碼,我想要使用:

import os 
import shutil 
#os.chdir('C:\\') 

dir_src = ('D:\\Users\\Tibi\\Pictures') 
dir_dst = ('D:\\test') 

#while True: 
# try: 
#  for folder in os.walk(dir_src): 
#   print(folder) 
#   for filename in os.listdir(dir_src): 
#    if filename.endswith('.CR2'): 
#     shutil.copy(dir_src + '\\' + filename, dir_dst) 
#    print(filename) 
# except UnicodeEncodeError: 
#  print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>File %s was Skipped!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" %filename) 
import pathlib 
import glob 

dir_src = pathlib.Path(r'D:\\Users\\Tibi\\Pictures//Move') 
dir_dst = pathlib.Path(r'D:\test') 

for file in dir_src.rglob('*.mp4'): 
    shutil.copy(str(file), str(dir_dst/file.name)) 
    print("Current File is: %s" % file) 
+0

'dir_src + filename'在它們之間沒有像「\」這樣的路徑分隔符。 – Brian

+0

對於原始字符串,它應該是'r'D:\ Users \ Tibi \ Pictures \ Move',但它不應該有所作爲。還要注意''* .mp4''不會匹配'file.MP4',如果你想忽略大小寫,你需要''*。[Mm] [Pp] 4''。 –

回答

1

添加路徑分隔符之間,以防止C:\\New FolderIMG_5221.CR2不存在的文件。更改此:

dir_src + filename 

這樣:

dir_src + '\\' + filename 

或這對於一個更通用的解決方案,可能不是在Windows上:

dir_src + os.path.sep + filename 
+0

任何想法爲什麼它會引發UnicodEncodeError?我拋出了一個例外,它有效,但我仍然有很多東西需要學習。看着這個跑步,我意識到它只是通過幾個文件夾循環。我怎樣才能打開每個文件夾並掃描每個.CR2文件? –

2

一般情況下,使用不作路徑+。使用os.path.join這是個聰明人:

shutil.copy(os.path.join(dir_src, filename), dir_dst) 

這會給你C:\...\folder\file而不是C:\...\folderfile

或者,你可以使用pathlib

import pathlib 
import shutil 

dir_src = pathlib.Path(r'C:\Users\Tibi\Desktop\New Folder\New Folder') 
dir_dst = pathlib.Path(r'D:\test') 

for file in dir_src.rglob('*.CR2'): 
    shutil.copy(str(file), str(dir_dst/file.name)) 

如果你需要不區分大小寫的匹配,使用這個'*.[Cc][Rr]2'代替'*.CR2'

+0

如果我拿走其他文件夾並從'C:\ Users'開始,它是否也會在子文件夾中運行? –

+0

是的,這就是'rglob()'所做的。它爲您提供與模式相匹配的所有子文件夾中的所有文件。 –

+0

我仍然不太瞭解Python,更不用說rglob()和pathlib了。這不是我所需要的,我不能完全弄明白。我有大約十幾個有這種文件類型的子文件夾,它沒有做任何事情。我添加打印(「當前文件是:%s」%文件)並且仍然沒有輸出,也沒有對目標文件夾進行任何更改。我還將圖片文件夾的子文件夾中的文件更改爲另一個目錄('D:\\ Users \\ Tibi \\ Pictures')。 –

相關問題