在目录上循环,但从末尾开始

  • 本文关键字:开始 循环 python-3.x
  • 更新时间 :
  • 英文 :


我有一个包含许多子目录的目录,每个子目录都遵循相同的命名约定;当天的日期。今天制作了一个文件夹:2021-04-22

我偶尔需要浏览这些目录并从其中读取一个文件,但一旦我读取了它,就不需要再读取了。

li = []
for root, dirs, files in os.walk(path):
for f in files:
li.append(f)

该列表显示了读取文件的顺序,这是一个字母(数字?(顺序。我知道最新的文件会因为命名约定而垫底。

如何从"结束"而不是"开始"开始for循环?

如果这是可能的,那么当我的标准得到满足时,我会退出循环,否则,从最后开始有什么意义?

编辑:我最初的命名约定打错了。是YYYY-MM-DD谢谢@null

要反转python中的任何可迭代或迭代器,请在reversed()中扭曲它。

在您的代码中:

li = []
for root, dirs, files in os.walk(path):
for f in reversed(files):
li.append(f)

假设您有以下目录树:

.
├── 1
│   ├── a
│   │   ├── 03-01-2021
│   │   └── 04-22-2021
│   ├── b
│   │   └── 04-21-2021
│   └── c
├── 2
│   ├── a
│   │   └── 05-01-2020
│   ├── b
│   └── c
│       └── 01-01-1966
└── 3
├── a
│   ├── 12-15-2001
│   └── 12-15-2001_blah
├── b
└── c

您可以使用pathlib和递归glob来获取目录。然后使用regex将日期模式反转为YYYY-MM-DD的ISO8601格式,并以相反的方式排序:

import re
from pathlib import Path 
p=Path('/tmp/test/')
my_glob='**/[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]*'
my_regex=r'.*/(d{2})-(d{2})-(d{4}).*'
for pa in sorted(
[pa for pa in p.glob(my_glob) if pa.is_dir()], 
key=lambda pa: re.sub(my_regex,r'3-2-1', str(pa)), reverse=True):
print(pa)

打印:

/tmp/test/1/a/04-22-2021
/tmp/test/1/b/04-21-2021
/tmp/test/1/a/03-01-2021
/tmp/test/2/a/05-01-2020
/tmp/test/3/a/12-15-2001_blah
/tmp/test/3/a/12-15-2001
/tmp/test/2/c/01-01-1966

'**/*'的glob使搜索递归并添加:

**/[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]*

将只返回与该命名模式匹配的文件和目录。通过添加测试if pa.is_dir(),我们只查看目录,而不是文件。

正则表达式:

my_regex=r'.*/(d{2})-(d{2})-(d{4})/'
re.sub(my_regex,r'3-2-1', str(pa))

删除除日期以外的所有内容,并将其反转为传递给sorted的密钥的ISO 8601。


您要求返回默认订单文件通常文件从最旧到最新都是广度优先的。也就是说,它取决于操作系统和实现。


您更新了文件确实具有YYYY-MM-DD命名约定的问题。如果是,只需更改或删除正则表达式即可。相同的基本方法处理这两种情况。

由于files是一个列表,您可以使用扩展列表切片来反转列表:

li = []
for root, dirs, files in os.walk(path):
for f in files[::-1]:
li.append(f)

最新更新