2012-04-10 56 views
1

[编辑:见下面的最终代码]我使用下面的代码从源目录中随机选择5个文件,然后将它们复制到一个新的目录。它给了我一个IO错误,它表示“没有这样的文件或目录'x'存在”其中“x”是没有目录路径的文件名。不知何故,它不会将路径存储在“文件”中。我看着这个论坛以及一个shutil教程,但我无法弄清楚。 (顺便说一下,这与我提到的前一个问题类似,但代码和错误发生了变化,当我得到它时,我会将最终代码发布到该问题)。提前致谢!shutil不存储随机选择/复制文件的路径?

import os 
import shutil 
import random 
import os.path 

src_dir = 'C:\\' 
target_dir = 'C:\\Test' 
src_files = (os.listdir(src_dir)) 
def valid_path(dir_path, filename): 
    full_path = os.path.join(dir_path, filename) 
    return os.path.isfile(full_path) 
files = [f for f in src_files if valid_path(src_dir, f)] 
choices = random.sample(files, 5) 
for files in choices: 
    shutil.copyfile(files, target_dir) 
    print ('Finished!') 

回答

1

尝试改变

shutil.copyfile(files, target_dir)

shutil.copyfile(os.path.join(src_dir, files), target_dir)

你只是使用src_dir测试的完整路径是否有效,则不要使用它再次。

编辑:考虑以下

src_dir = 'C:\\' 
target_dir = 'C:\\Test' 
# Create a list of filenames 
src_files = (os.listdir(src_dir)) 
# Create a list of full paths (valid) 
src_paths = [f for f in [os.path.join(src_dir, f) for f in src_files] if os.path.isfile(f)] 
# Do selection 
choices = random.sample(src_paths, 5) 
for path in choices: 
    print path 
    shutil.copy(path, target_dir) 
    print ('Finished!') 

注意,我改变copyfilecopy因为你指定目的地目录,而不是一个目标文件。

你也可以添加一个领先r你的字符串之前,使他们raw strings以避免转义反斜线:

dir = 'C:\\Temp\\' # Is the same as 
dir = r'C:\Temp\' 

但SO语法高亮不喜欢它,所以我把它

+0

不错!这似乎是一个窍门。现在它告诉我,我没有写信给我的目的地的许可,但似乎已经超过了存储路径的问题。谢谢! – user1252778 2012-04-10 16:22:25

+0

看我的编辑,我认为你需要'copy'函数而不是'copyfile'函数。干杯:-) – jedwards 2012-04-10 16:23:44

1

os.listdir()仅返回文件名。您将需要使用os.path.join()加入他们的路径。

1

当你src_files = os.listdir(src_dir),你只是得到一个文件名列表。 然后您列举[f for f in src_files if valid_path()],只保留一个文件名列表。

当你终于shutil.copyfiles(files, target_dir),你仍然只传递文件名列表,而不是整个路径。

files = [os.path.join(src_dir, f) for f in src_files if valid_path(src_dir, f)] 
0

这是我最终使用的最终代码。非常感谢你的帮助!

import os 
import shutil 
import random 
import os.path 

src_dir = 'C:\\' 
target_dir = 'C:\\TEST' 
src_files = (os.listdir(src_dir)) 
def valid_path(dir_path, filename): 
    full_path = os.path.join(dir_path, filename) 
    return os.path.isfile(full_path) 
files = [os.path.join(src_dir, f) for f in src_files if valid_path(src_dir, f)] 
choices = random.sample(files, 5) 
for files in choices: 
    shutil.copy(files, target_dir) 
    print ('Finished!')