1

[编辑:见下面的最终代码] 我正在使用下面的代码从源目录中随机选择 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

3 回答 3

1

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

于 2012-04-10T16:07:48.773 回答
1

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

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

files = [os.path.join(src_dir, f) for f in src_files if valid_path(src_dir, f)]
于 2012-04-10T16:07:58.650 回答
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以使它们成为原始字符串,以避免必须转义反斜杠:

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

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

于 2012-04-10T16:08:31.023 回答