Кто-то предложил мне создать программу, которая сортирует фотографии по папкам в зависимости от месяца, когда они были сделаны, и я хочу сделать это в одну строку (знаю, это неэффективно и нечитабельно, но я все равно хочу это сделать, потому что один- лайнеры классные)
Для этого мне понадобился цикл 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)]
?
Обратите внимание: я понимаю, что это неэффективная и плохая практика. Если бы я делал это для других целей, а не просто для развлечения, чтобы посмотреть, смогу ли я это сделать, я бы, очевидно, не пытался сделать это в одну строку.
НЕ используйте понимание списка, если вы не планируете использовать результат, это не путь к одной строке цикла for
. Вы НЕ должны одну строку эту проблему. Если хотите, можете использовать ;
, но это плохая практика.
Пытаться запихнуть всю свою программу в одну строчку — все равно, что пытаться запихнуть всю свою семью в одни трусы. Может быть, вы можете это сделать, но, пожалуйста, не делайте этого.
@Error-SyntacticalRemorse Это совершенно нормально для игры в гольф или для других целей.
@ruohola, чем просто использовать ;
, чтобы написать несколько строк в одной. Понимание списка потребляет память для каждого цикла, в лучшем случае оно использует None
для каждого вызова, в худшем случае каждый вызов возвращает большой объект, таким образом создавая большой временный список, который никогда не используется.
Эффективность понимания списков в первую очередь заключается в создании списка, сокращении шага lst.append(item)
цикла. Если вы не пытаетесь создать список, то составление списка бессмысленно. Поскольку вы добавляете результат функции в список, а функция возвращает None
, вы получаете список None
@C.Nivs перемещает изображения в соответствующую папку, поэтому я предполагаю, что все работает правильно.
@ user2357112, лол, хорошая метафора. Я согласен с вами, и теперь я понял, что мне нужно, чтобы моя программа была более сложной, поэтому я расширяю ее до нескольких строк.
Является ли понимание списка плохим способом сделать это?
ДА. Но если вы хотите сделать это одной строкой, то либо так, либо с помощью ";". Например:
for x in range(5): print(x);print(x+2)
И, кстати, простое переименование файла со слэшем не создаст папку. Вы должны использовать os.mkdir('foldername')
.
В конце концов, если вы действительно хотите это сделать, я бы просто порекомендовал сделать это обычным образом во многих строках, а затем разделить их точкой с запятой в одной строке.
Ой, не догадался проверить, что папка уже есть и создать если нет, спасибо!
Это плохо сразу в двух отношениях:
Кажется, ваша цель - переименовать последовательность файлов, нет создав список. Я полагаю, что средство Python, которое вам нужно, — это функция map
. Напишите функцию для изменения одного имени файла, а затем используйте map
для списка имен файлов — или кортежей старых и новых имен файлов — для выполнения последовательности желаемых изменений.
извините, это могло быть очевидно в ответе, но каков побочный эффект?
rename
— это побочный эффект: вы создаете список, и имена файлов волшебным образом меняются, пока вы это делаете.
map
не имеет побочных эффектов. Это для создания итераторов. Это не будет даже выполнять каких-либо побочных эффектов, если вы не используете итератор.
о, хорошо, это имеет смысл.
Если это просто печать
[]
, вы уверены, чтоif f.endswith
делает то, что вы хотите?