使用map(shutil.move)移动指定文件失败,如何修复代码使其生效?
问题解决:用
map()调用shutil.move()移动文件失败的原因与修复方案 你遇到的问题其实是对map()的参数传递逻辑理解有偏差,我来给你拆解清楚并提供几种可行的修复方法:
为什么原来的map写法不生效?
当你写map(shutil.move, books, 'DirHTML')时,map()会把第三个参数'DirHTML'当成可迭代对象——也就是逐个取出字符串里的字符,作为shutil.move()的第二个参数。换句话说,它实际执行的是:
shutil.move(books[0], 'D') shutil.move(books[1], 'i') shutil.move(books[2], 'r') ...
这显然不是你要的“把所有文件移动到DirHTML目录”的操作,自然看不到文件被正确移动。
另外还要注意:map()返回的是一个惰性迭代器,必须主动遍历它(比如用list()包裹)才会真正执行里面的函数调用,这也是容易踩的小坑!
三种可行的修复方案
方案1:用functools.partial固定目标路径
这个方法适合需要复用“移动到指定目录”逻辑的场景,先把shutil.move的目标路径绑定好,再传给map():
import shutil from functools import partial books = ['HTML-Head First HTML and CSS - 2nd Ed.pdf', 'HTML and CSS - Design and Build Websites - Jon Duckett - November 2011.pdf', "Murach's HTML5 and CSS3 3rd Edition (2015).pdf", 'HTML5-cheat-sheet.pdf'] # 提前绑定目标目录作为shutil.move的dst参数 move_to_dir = partial(shutil.move, dst='DirHTML') # 执行移动(用list()触发迭代器执行) list(map(move_to_dir, books))
方案2:生成重复的目标路径迭代器
用itertools.repeat生成一个和books长度匹配的、全是'DirHTML'的迭代器,让map()每次都拿到正确的目标路径:
import shutil import itertools books = ['HTML-Head First HTML and CSS - 2nd Ed.pdf', 'HTML and CSS - Design and Build Websites - Jon Duckett - November 2011.pdf', "Murach's HTML5 and CSS3 3rd Edition (2015).pdf", 'HTML5-cheat-sheet.pdf'] # itertools.repeat会无限生成'DirHTML',map会在books遍历完后自动停止 list(map(shutil.move, books, itertools.repeat('DirHTML')))
方案3:用lambda表达式直接包装
如果只是临时用一次,lambda写法更直观,不需要额外导入模块:
import shutil books = ['HTML-Head First HTML and CSS - 2nd Ed.pdf', 'HTML and CSS - Design and Build Websites - Jon Duckett - November 2011.pdf', "Murach's HTML5 and CSS3 3rd Edition (2015).pdf", 'HTML5-cheat-sheet.pdf'] # 用lambda把每个book和固定目标目录传给shutil.move list(map(lambda book: shutil.move(book, 'DirHTML'), books))
内容的提问来源于stack exchange,提问作者user9062604
相关产品推荐
相关产品推荐

