【问题标题】:Python while loop withPython while循环
【发布时间】:2020-11-11 22:59:43
【问题描述】:

我正在尝试使用 while 循环来遍历文件夹中的 .xml 文件。但是,在 while 循环运行时,文件被添加到文件夹中。这是我目前使用的代码的简化版本:

import os

my_folder = "d:\\xml\\"

while True:
    files = [f for f in os.listdir(my_folder) if f.endswith(".xml")]
    while files:
        for file in files:
            # do whatever with the xml file
            os.remove(my_folder + file)
        files = [f for f in os.listdir(my_folder) if f.endswith(".xml")]

我想做的是通过仅用一行填充文件列表来整理代码。我想要类似的东西:

while files = [f for f in os.listdir(my_folder) if f.endswith(".xml")]:

但是,我知道这行不通。我想 Python 可以做到这一点,但我不知道正确的语法。

补充说明: 我正在使用带有 Python 3.7.6 的 Windows 10

【问题讨论】:

  • 你不能删除内部while 并只使用while True: files = ...; for file in files: ... 吗?
  • 从 3.8 开始有赋值运算符while files := [f for f...
  • 我更喜欢两个循环的方法。您可以使用一个函数来使工作的划分更加清晰,但总体思路是外部循环获取一次性快照,对其进行处理,然后执行 time.sleep。内部循环在该快照上工作,直到完成。
  • 我想它会因为如果没有文件它会忽略“文件中的文件”循环......

标签: python while-loop


【解决方案1】:

您可以通过删除内部while 循环和对files 的第二个赋值来简化代码。这将无限循环,查看目录中是否有xml 文件,如果有则处理并删除它们,然后再继续循环。 (如果没有新文件,您也可以添加一个简短的sleep。)

while True:
    files = [f for f in os.listdir(my_folder) if f.endswith(".xml")]
    for file in files:
        # do whatever with the xml file
        os.remove(my_folder + file)
    

如另一个答案所示,您可以也使用:= 运算符和类似以下...

while True:
    while (files := [...]):
        ...

...但这与没有内部while 的行为完全相同。仅当您例如想在暂时没有文件的情况下做某事,即在外循环中有代码不在内循环中,这可能会有所作为。

【讨论】:

  • 我想你可以做while (files := [...]) or True:。但是第一个解决方案似乎仍然更好 - 特别是如果使用 for path in glob(...): 代替。
  • @ekhumoro while:= 只会节省一行;你仍然需要for,你可以通过将列表理解直接移动到for 循环头来做同样的事情。但是使用for file in glob.glob("*.xml") 确实是一个不错的主意,使它更具可读性。
猜你喜欢
  • 2014-11-02
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 2014-05-30
  • 1970-01-01
相关资源
最近更新 更多