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