繁体   English   中英

使用地图移动文件(shutil.move)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM