问题描述
我有一个很好的 os.walk()
包装器,可以将深入发现的文件和目录映射到 Path
的子类:
类查找:
@staticmethod
def deep(path: Union[str,Path,'WalkPath'],sort_key=lambda p: str(p).lower()) -> ['WalkPath']:
if Path(path).is_file():
return [WalkPath(path)]
for root,dirs,files in os.walk(WalkPath(path)):
dirs = sorted([WalkPath(root).joinpath(d) for d in dirs],key=sort_key)
files = sorted([WalkPath(root).joinpath(f) for f in files],key=sort_key)
yield WalkPath(root,dirs=dirs,files=files)
yield from files
这很有效 - 我可以对结果进行迭代,并对其中任何一个结果进行检查,检查其中包含的文件或目录。
不幸的是,返回的结果相当未排序。我知道我可以做到这一点:
paths = sorted(Find.deep(root),key=lambda p: str(p).lower())
事后,或者我可以创建一个包装函数:
@staticmethod
def sorted_deep(path):
yield from sorted(Find.deep(root),key=lambda p: str(p).lower())
但我想知道是否有办法直接在主函数中处理排序?我尝试研究是否可以重新处理它以适合 lambda 表达式,但无法使其与分配目录和文件一起工作。
为了完整起见,这里是 WalkPath 对象:
#!/usr/bin/env python
import os
import pathlib
from pathlib import Path
from typing import Union
class WalkPath(Path):
_flavour = type(Path())._flavour
def __init__(self,*args,dirs: []=[],files: []=[]):
"""Initialize WalkPath object.
Args:
dirs (list): Dirs provided by os.walk(),defauls to []
files (list): Files provided by os.walk(),defaults to []
"""
super().__init__()
self.dirs: [WalkPath] = list(map(WalkPath,dirs))
self.files: [WalkPath] = list(map(WalkPath,files))
def joinpath(self,path) -> 'WalkPath':
joined = WalkPath(super().joinpath(path))
self.__dict__ = joined.__dict__.copy()
return joined
@property
def is_terminus(self) -> bool:
return self.is_file() or not self.dirs
@property
def dirs_abs(self) -> ['WalkPath']:
return [self.joinpath(d) for d in self.dirs]
@property
def files_abs(self) -> ['WalkPath']:
return [self.joinpath(f) for f in self.files]
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)