使用列表理解的一行for循环

2024-06-02 14:14:05 发布

您现在位置:Python中文网/ 问答频道 /正文

有人向我提出挑战,要我创建一个程序,根据拍摄的月份将他们的照片排序到文件夹中,我想一行一行地完成(我知道,这样效率低而且不可读,但我还是想这样做,因为一行行很酷)

我需要一个for循环来完成这个任务,但是我知道在一行中使用for循环的唯一方法是列表理解,所以我就是这么做的,但是它创建了一个空列表,并且不打印列表中的任何内容。你知道吗

我要做的是将文件重命名为month created+原始文件名(例如: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)],有什么原因吗?你知道吗

请注意:我理解这是低效和不好的做法。如果我做这件事的目的不仅仅是为了好玩,看看我是否能做到,我显然不会试图在一行。你知道吗


Tags: path方法importnone列表fortimeos
2条回答

这在两个方面是不好的:

  1. 当你实际上对构建一个列表不感兴趣,而忽略了刚刚构建的对象时,你就使用了列表理解。你知道吗
  2. 你的构造在操作系统中有一个丑陋的副作用。你知道吗

您的目的似乎是重命名一系列文件,而不是构建一个列表。我相信,您需要的Python工具是map函数。编写一个函数来更改一个文件名,然后在文件名列表或新旧文件名的元组上使用map来运行所需更改的序列。你知道吗

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

是的。但如果你想在一行中完成它,它要么就是那个,要么就是用“;”。例如:

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

顺便说一下,仅仅重命名包含斜杠的文件不会创建文件夹。你必须使用os.mkdir('foldername')。你知道吗

最后,如果您真的想这样做,我建议您在多行中正常执行,然后在一行中用分号分隔。你知道吗

相关问题 更多 >