我想从文件系统中删除一些文件。我得到一个包含文件绝对路径的列表,逻辑是删除找到的文件并打印它们的名称。
我编写的逻辑如下,这将删除temp_list
中找到的文件,但不会打印其名称。
log.info("Files removed [%s]", [os.remove(f) for f in temp_list if os.path.exists(f)])
输出为[None, None..]
。
我可以修改语句,以便删除文件,并在单个语句中打印删除的文件吗?
答案 0 :(得分: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])
然而,虽然这会删除并打印一行中的文件,但至少有两个原因,它不被视为“pythonic”或良好做法:
在列表推导中使用方法的副作用通常是不好的做法。如果您决定不再需要该日志语句并注释或删除该行,请考虑会发生什么!
在这种特殊情况下,列表理解的条件也是非常反直觉的,因为您需要通过remove
否定“{1}}的”结果“使其”真实“。 {1}}或(甚至更糟)and os.remove(f) is None
。
相反,我建议你做这样的事情:
and not os.remove(f)
这可能是更多的代码行,但它更容易理解,因此可以被认为更“pythonic”。