2015-05-28 3 views
2

Я хочу удалить некоторые файлы из файловой системы. Я получаю список, имеющий абсолютный путь к файлам, а логика - удаление найденных файлов и печать их имени.Удаление файлов в Pythonic способ

Logic Я написал следующее: это удаляет найденный файл в temp_list, но не печатает их имя.

log.info("Files removed [%s]", [os.remove(f) for f in temp_list if os.path.exists(f)]) 

Выходной сигнал [None, None..].

Могу ли я изменить утверждение, чтобы файлы были удалены и удалены файлы также напечатаны в одном заявлении?

+3

Использование понимания списка для побочных эффектов, как правило, является плохой практикой, но вы можете сделать '[f для f в temp_list, если os.path.exists (f) и os.remove (f) is None]' – jonrsharpe

+2

@tobias_k it должно быть чем-то правдой-y для условия фильтрации, чтобы включить 'f' в выход; вы можете сохранить несколько символов с 'не', я полагаю. – jonrsharpe

+0

@jonrsharpe Вы правы, не думали об этом. –

ответ

2

Могу ли я изменить утверждение, чтобы файлы были удалены и удалены файлы также напечатаны в одном заявлении?

Да, вы можете, как отметил @jonrsharpe, поставив фактический вызов remove в состояние части списка понимания

log.info("Files removed [%s]", [f for f in temp_list if os.path.exists(f) and os.remove(f) is None]) 

Однако, в то время как это снимает и печатает файлы одна строка, это не считается «вещий», или хорошая практика, по крайней мере по двум причинам:

  1. Использование методов внутри списковых для их побочных эффектов, как правило, плохая практика. Подумайте, что произойдет, если вы решите, что вам больше не нужен этот оператор журнала и комментарий или удалить строку!

  2. В данном конкретном случае, состояние список понимание является довольно нелогичным, а также, как вам нужно, чтобы свести на нет «результат» в remove, чтобы сделать его «truthy», делая либо and os.remove(f) is None или (еще хуже) and not os.remove(f).

Вместо этого, я предлагаю вам сделать что-то вроде этого:

files_to_remove = [f for f in temp_list if os.path.exists(f)] 
for f in files_to_remove: 
    os.remove(f) 
log.info("Files removed [%s]", files_to_remove) 

Это может быть больше строк кода, но это легче понять, и поэтому может считаться более «вещий».

Смежные вопросы