使用列表理解的单行“ for”循环

时间:2019-05-28 20:46:14

标签: python python-3.x list-comprehension file-move

有人挑战我创建一个程序,根据拍摄的月份将其图片分类到文件夹中,我想一行执行(我知道这效率低下且难以理解,但是我仍然想要这样做因为单线很酷)

我需要一个for循环来完成此操作,但是我知道在一行中使用for循环的唯一方法是列表理解,这就是我所做的,但是它创建了一个空列表,并且不打印任何内容从列表中或其他任何内容开始。

我正在做的是将文件重命名为创建月份+原始文件名(例如:bacon.jpg --> May\bacon.jpg

这是我的代码(Python 3.7.3):

import time
import os.path
[os.rename(str(os.fspath(f)), str(time.ctime(os.path.getctime(str(os.fspath(f))))).split()[1] + '\\' + str(os.fspath(f))) for f in os.listdir() if f.endswith('.jpg')]

和更具可读性的非列表理解版本:

import time
import os.path
for f in os.listdir():
    fn = str(os.fspath(f))
    dateCreated = str(time.ctime(os.path.getctime(fn)))
    monthCreated = dateCreated.split()[1]
    os.rename(fn, monthCreated + '\\' + fn)

列表理解是一种不好的方法吗?另外,是否有原因,如果我打印列表,它是[]而不是[None, None, None, None, None, (continuing "None"s for every image moved)]

请注意:我知道这是低效率的做法,也是不好的做法。如果我出于娱乐目的而不是为了看看是否可以做到这一点而这样做,显然我不会尝试一行完成。

2 个答案:

答案 0 :(得分:1)

这在两个方面都不好:

  1. 当您实际上对构造列表不感兴趣时​​,您正在使用列表推导-您会忽略刚构造的对象。
  2. 您的构建在操作系统中具有丑陋的副作用。

您的目的似乎是重命名文件序列,而不是 构造列表。我相信,您想要的Python工具是map函数。编写一个函数来更改一个文件名,然后在文件名列表(或旧的新文件名的元组)上使用map来完成所需的更改序列。

答案 1 :(得分:0)

列表理解是一种不好的方法吗?

是。但是,如果您想在一行中执行此操作,则可以使用“;”。例如:

 for x in range(5): print(x);print(x+2)

而且,顺便说一句,仅重命名包含斜杠的文件不会创建文件夹。您必须使用os.mkdir('foldername')

最后,如果您确实想要这样做,我建议您通常在多行中执行此操作,然后在一行中用分号将其分开。