2017-02-27 89 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')。 –

相关问题