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

我想使用 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)


catspeake
浏览 125回答 3
3回答

慕仙森

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)

湖上湖

有一种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你可以在github或PyPi 上找到 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)

LEATH

我的解决方案: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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python