[英]Move files with map(shutil.move)
我想将以下书籍移至指定的DirHTML
目录。
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']
可以使用以下代码轻松将它们移动到DirHTML
:
import shutil
for book in books:
shutil.move(book, 'DirHTML')
当我尝试
map(shutil.move, books, 'DirHTML')
没有文件移动。 如何使代码正常工作?
首先让我这样说:您可以通过这种方式使用map
,但是我认为这不是一个好主意。 这意味着要转换可迭代对象,而不要产生副作用。 当用于副作用时,就像您所做的那样,IMO更加清楚了原始命令性代码。
现在,如果您坚持使用地图,请继续阅读。 这里可能有两个问题。
首先,如其他答案所述,您无法以这种方式传递目标目录。 Tripleee显示了一些解决方案/解决方法; 这是另一个:
from functools import partial
map(partial(shutil.move, dst='DirHTML'), books)
其次,如果您使用的是Python 3:则地图是惰性的。 它仅在迭代时评估其结果。 例如,您可以将结果传递给list()
:
list(map(partial(shutil.move, dst='DirHTML'), books))
提示:在shutil.move
周围写一个小包装,以打印其参数,以更好地了解发生了什么。
从这里的官方python文档
如果传递了其他可迭代的参数,则函数必须接受那么多参数,并且并行地将其应用于所有可迭代的项目
在您的map
片段中,它将充当:
for i, j in zip(books, 'DirHTML'):
shutil.move(i, j)
DirHTML
参数的工作与您期望的一样,将整个字符串传递给move
但是依次传递了每个字符。
在第一个参数之后map
每个参数都应该是iterable
。 确实, 'DirHTML'
是可迭代的,但是对其进行迭代可以获得['D', 'i', 'r', 'H', 'T', 'M', 'L']
,这显然不是您想要的。
如果您坚持要在这里使用map
,请尝试
map(lambda x: shutil.move(x, 'DirHTML'), books)
或者可能
map(shutil.move, books, ['DirHTML'] * len(books))
两者都不是特别透明或优雅的,在后一种情况下,不必要地效率低下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.