Найти файл на 1 уровень папки ниже

#python #python-3.x #os.path

#python #python-3.x #os.path

Вопрос:

Я пытаюсь получить places.sqlite полный путь к файлу, присутствующему при '%APPDATA%MozillaFirefoxProfiles<random_folder>places.sqlite' использовании модуля Python OS. Проблема, как вы можете видеть, <random_folder> имеет случайное имя, и внутри папки может быть несколько Profiles папок.

Как мне перейти / найти путь к places.sqlite файлу?

Ответ №1:

В идеале вы хотели бы просмотреть каждую папку для поиска этого файла. В терминале команда ‘locate file_name’ сделает это за вас. В файле python вы можете использовать следующую команду:

 import os


db_path = os.path.join(os.getenv('APPDATA'), r'MozillaFirefoxProfiles')


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))
 

Ответ №2:

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
 

Ответ №3:

Используйте os модуль для перечисления всех каталогов в %APPDATA%MozillaFirefoxProfiles

перебирайте каталоги, пока не найдете файл places.sqlite (также с использованием модуля os)

Комментарии:

1. Для этого есть встроенная функция. os.walk()

Ответ №4:

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:
        # ....