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)
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
但这对您的示例仍然无济于事,因为您想跳过以“。”开头的文件。- 所以你的解决方案是正确的 - 但不是很有效:
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)
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)
添加回答
举报