为了账号安全,请及时绑定邮箱和手机立即绑定

在 pathlib 中使用递归文件搜索和排除startswith()

在 pathlib 中使用递归文件搜索和排除startswith()

catspeake 2022-10-06 18:55:41
我想使用 pathlib 递归搜索所有文件夹中的所有文件,但我想排除以“。”开头的隐藏系统文件。(如'.DS_Store')但我在pathlib中找不到像startswith这样的函数。如何在 pathlib 中实现startswith?我知道如何用 os 来做到这一点。def recursive_file_count(scan_path):    root_directory = Path(scan_path)    fcount = len([f for f in root_directory.glob('**/*') if f.startswith(".")])    print(fcount)
查看完整描述

3 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

startswith()是一个 Python 字符串方法,见https://python-reference.readthedocs.io/en/latest/docs/str/startswith.html

由于您的 f 是 Path 对象,因此您必须先将其转换为字符串str(f)

def recursive_file_count(scan_path):

    root_directory = Path(scan_path)

    fcount = len([f for f in root_directory.glob('**/*') if str(f).startswith(".")])

    print(fcount)


查看完整回答
反对 回复 2022-10-06
?
湖上湖

TA贡献2003条经验 获得超2个赞

有一种startswith- 你可以使用pathlib.Path.is_relative_to():


pathlib.Path.is_relative_to()在 Python 3.9 中添加,如果您想在早期版本(3.6 以上)上使用它,您需要使用 backport pathlib3x:


$> python -m pip install pathlib3x

$> python

>>> p = Path('/etc/passwd')

>>> p.is_relative_to('/etc')

True

>>> p.is_relative_to('/usr')

False

你可以在githubPyPi 上找到 pathlib3x

但这对您的示例仍然无济于事,因为您想跳过以“。”开头的文件。- 所以你的解决方案是正确的 - 但不是很有效:


def recursive_file_count(scan_path):

    root_directory = Path(scan_path)

    fcount = len([f for f in root_directory.glob('**/*') if not str(f.name).startswith(".")])

    print(fcount)

想象一下,您在scan_path中有 200 万个文件,这将创建一个包含 200 万个 pathlib.Path 对象的列表。哇,这需要一些时间和记忆......

最好有一种像 fnmatch 这样的过滤器或用于 glob 函数的东西——我正在考虑将它用于 pathlib3x。

Path.glob() 返回一个生成器迭代器,它需要更少的内存。

所以为了节省内存,解决方案可以是:

def recursive_file_count(scan_path):

    root_directory = Path(scan_path)

    fcount = 0

    # we only have one instance of f at the time

    for f in root_directory.glob('**/*'):

        if not str(f.name).startswith(".")]):

            fcount = fcount + 1

    print(count)


查看完整回答
反对 回复 2022-10-06
?
LEATH

TA贡献1936条经验 获得超6个赞

我的解决方案:


def recursive_file_count(scan_path):

    root_directory = Path(scan_path)

    fcount = len([f for f in root_directory.glob('**/*') if not str(f.name).startswith(".")])

    print(fcount)


查看完整回答
反对 回复 2022-10-06
  • 3 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信