shutil不存储随机选择/复制文件的路径?

时间:2012-04-10 16:03:55

标签: python shutil

[编辑:参见下面的最终代码]我正在使用下面的代码从源目录中随机选择5个文件,然后将它们复制到新目录。它给了我一个IO错误,其中显示“没有这样的文件或目录'x'存在”,其中“x”是没有目录路径的文件名。不知何故,它没有将路径存储在“文件”中。我看了这个论坛以及一个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!')

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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)]

答案 2 :(得分: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!')

请注意,由于您指定了目标目录而未指定目标文件,因此我将copyfile更改为copy

您还可以在字符串前添加前导r以使其raw strings,以避免必须转义反斜杠:

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

但SO语法荧光笔不喜欢它所以我把它拿出来

答案 3 :(得分: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!')