我有一个包含许多子目录的目录,每个子目录都遵循相同的命名约定;当天的日期。今天制作了一个文件夹: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)