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