问题描述
我正在尝试使用 Python 操作系统模块获取 places.sqlite
中存在的 '%APPDATA%\Mozilla\Firefox\Profiles\<random_folder>\places.sqlite'
文件的完整路径。如您所见,<random_folder>
的名称是随机的,Profiles
文件夹中可能有多个文件夹。
如何导航/找到 places.sqlite
文件的路径?
解决方法
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))
,
使用 os
模块列出 %APPDATA%\Mozilla\Firefox\Profiles\
中的所有目录
遍历目录直到找到places.sqlite文件(也使用os模块)
,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:
# ....