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

Python shutil不存储随机选择/复制文件的路径?,python,shutil,Python,Shutil,[编辑:参见下面的最终代码]我使用下面的代码从源目录中随机选择5个文件,然后将它们复制到新目录。它给了我一个IO错误,它说“没有这样的文件或目录'x'存在”,其中“x”是没有目录路径的文件名。不知何故,它没有将路径存储在“文件”中。我在这个论坛上查看了shutil教程,但我想不出来。(顺便说一句,这与我之前问的一个问题类似,但代码和错误发生了变化。我会在问题运行后将最终代码发布到该问题)。提前谢谢 import os import shutil import random import os.p

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

os.listdir()
仅返回文件名。您需要使用
os.path.join()
将路径连接到它们。

当您
src\u files=os.listdir(src\u dir)
时,您只会得到一个文件名列表。 然后在src_文件中枚举
[f for f,如果路径有效()]
,只保留一个文件名列表

当您最终
shutil.copyfiles(files,target\u dir)
时,您仍然只传递文件名列表,而不是整个路径

files = [os.path.join(src_dir, f) for f in src_files if valid_path(src_dir, f)]
试着改变

shutil.copyfile(文件,目标目录)

shutil.copyfile(os.path.join(src\u dir,files),target\u 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语法highlighter不喜欢它,所以我把它取了出来

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

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!')

美好的这似乎奏效了。它现在告诉我,我没有权限写入我的目的地,但它似乎已经解决了存储路径的问题。谢谢查看我的编辑,我认为您需要
copy
功能,而不是
copyfile
功能。干杯:-)