查找下一级文件夹的文件

Find a file 1 folder level down

我正在尝试使用 Python OS 模块获取 '%APPDATA%\Mozilla\Firefox\Profiles\<random_folder>\places.sqlite' 中存在的 places.sqlite 个文件中的 full_path 个。如您所见,问题 <random_folder> 的名称是随机的,并且 Profiles 文件夹中可能有多个文件夹。

如何 navigate/find places.sqlite 文件的路径?

使用os模块列出%APPDATA%\Mozilla\Firefox\Profiles\

中的所有目录

遍历目录直到找到 places.sqlite 文件(也使用 os 模块)

os.walk 递归地给出路径中所有文件的列表。使用它来搜索 'places.sqlite' 如下。

path = ""
for root, dirs, files in os.walk("%APPDATA%\Mozilla\Firefox\Profiles\"):
    if "places.sqlite" in files:
        path = os.path.join(root, 'places.sqlite')
        break

理想情况下,您希望遍历每个文件夹来搜索此文件。在终端 'locate file_name' 命令中会为你做这件事。在 python 文件中,您可以使用以下命令:

import os


db_path = os.path.join(os.getenv('APPDATA'), r'Mozilla\Firefox\Profiles')


def find_file(file_name, path):
    for root_folder, directory, file_names in os.walk(path):
        if file_name in file_names:
            return os.path.join(root_folder, file_name)


print(find_file('places.sqlite', db_path))

A glob 可能更简单,因为在这种情况下,人们希望文件位于 Profiles 文件夹下方的级别或根本不存在。


import os
import pathlib

profiles = pathlib.Path(os.environ["APPDATA"]) / "Mozilla" / "Firefox" / "Profiles"
# rglob will recursively search as well
if places := list(profiles.rglob("places.sqlite")):
    print(places[0]) # will print the sqllite file path
    with places[0].open() as f:
        # ....