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

时间:2018-01-02 07:54:23

标签: python

我希望将以下书籍移至指定的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')

没有移动文件。 如何使代码工作?

3 个答案:

答案 0 :(得分:1)

首先让我这样说:你可以这样使用tvDescription.setText(hashText); tvDescription.setMovementMethod(LinkMovementMethod.getInstance()); ,但我认为这不是一个好主意。它意味着转换迭代,而不是有副作用。当用于副作用时,正如您所做的那样,原始命令代码对IMO来说更加清晰。

现在,如果您坚持使用地图,请继续阅读。这里可能存在两个问题。

首先,正如其他答案中所解释的那样,您无法按照自己的方式传递目标目录。 tripleee显示了一些解决方案/解决方法;这是另一个:

map

其次,如果您正在使用Python 3:地图是懒惰的。它只会在迭代它时评估其结果。例如,您可以将结果传递给from functools import partial map(partial(shutil.move, dst='DirHTML'), books)

list()

提示:在list(map(partial(shutil.move, dst='DirHTML'), books)) 周围写一个小包装,打印其参数,以便更好地查看正在发生的事情。

答案 1 :(得分:0)

来自官方python doc here

  

如果传递了其他可迭代参数,则函数必须采用该参数   许多参数,并应用于所有迭代中的项目   平行

map代码段中,它将充当:

for i, j in zip(books, 'DirHTML'):
    shutil.move(i, j)

DirHTML参数与预期的工作一样,将整个字符串传递给move但按顺序传递每个字符。

答案 2 :(得分:0)

第一个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))

这两者都不是特别透明或优雅,在后一种情况下,不必要地效率低下。