[英]One-line “for” loop using list comprehension
有人要求我創建一個程序,將程序根據拍攝的月份將其圖片分類到文件夾中,因此我希望將其排成一行(我知道這效率低下且不可讀,但是我仍然想這樣做,因為班輪很酷)
我需要一個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)]
?
請注意:我知道這是低效率的做法,也是不好的做法。 如果我這樣做只是出於娛樂目的,而不是為了看看我是否可以做到,那么我顯然不會嘗試一味地做到這一點。
從兩個方面來講,這是不好的:
您的目的似乎是重命名文件序列, 而不是構造列表。 我相信,您想要的Python工具是map
函數。 編寫一個函數來更改一個文件名,然后在文件名列表(或舊的,新的文件名的元組)上使用map
來執行所需的更改序列。
列表理解是一種不好的方法嗎?
是。 但是,如果您想在一行中執行此操作,則可以使用“;”。 例如:
for x in range(5): print(x);print(x+2)
而且,順便說一句,僅重命名包含斜杠的文件將不會創建文件夾。 您必須使用os.mkdir('foldername')
。
最后,如果您真的想這樣做,我建議您通常在多行中執行此操作,然后在一行中用分號將其分開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.