有人挑战我创建一个程序,根据拍摄的月份将其图片分类到文件夹中,我想一行执行(我知道这效率低下且难以理解,但是我仍然想要这样做因为单线很酷)
我需要一个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)]
?
请注意:我知道这是低效率的做法,也是不好的做法。如果我出于娱乐目的而不是为了看看是否可以做到这一点而这样做,显然我不会尝试一行完成。
答案 0 :(得分:1)
这在两个方面都不好:
您的目的似乎是重命名文件序列,而不是 构造列表。我相信,您想要的Python工具是map
函数。编写一个函数来更改一个文件名,然后在文件名列表(或旧的新文件名的元组)上使用map
来完成所需的更改序列。
答案 1 :(得分:0)
列表理解是一种不好的方法吗?
是。但是,如果您想在一行中执行此操作,则可以使用“;”。例如:
for x in range(5): print(x);print(x+2)
而且,顺便说一句,仅重命名包含斜杠的文件不会创建文件夹。您必须使用os.mkdir('foldername')
。
最后,如果您确实想要这样做,我建议您通常在多行中执行此操作,然后在一行中用分号将其分开。