Однострочный цикл «for» с использованием списка - PullRequest
0 голосов
/ 28 мая 2019

Кто-то предложил мне создать программу, которая сортирует их изображения по папкам в зависимости от месяца, когда они были взяты, и я хочу сделать это в одну строку (я знаю, это неэффективно и нечитабельно, но я все еще хочу это сделатьпотому что однострочные - это круто)

Мне нужен цикл 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 ]

1 голос
/ 29 мая 2019

Это плохо в двух отношениях:

  1. Вы используете понимание списка, когда вы на самом деле не заинтересованы в создании списка - вы игнорируете объект, который вы только что создали.
  2. У вашей конструкции неприятный побочный эффект в ОС.

Ваша цель - переименовать последовательность файлов, не - создать список. Я полагаю, что нужное вам средство Python - это функция map. Напишите функцию для изменения одного имени файла, а затем используйте map в списке имен файлов - или кортежей старых, новых имен файлов - для запуска последовательности требуемых изменений.

0 голосов
/ 29 мая 2019

Является ли понимание списков плохим способом сделать это?

ДА.Но если вы хотите сделать это в одной строке, это либо так, либо с использованием «;».Например:

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

И, кстати, простое переименование файла с косой чертой не приведет к созданию папки.Вы должны использовать os.mkdir('foldername').

В конце концов, если вы действительно хотите это сделать, я бы просто рекомендовал делать это обычно во многих строках, а затем разделять их точкой с запятой в одной строке.

...