Как я могу найти путь к данному файлу? - PullRequest
6 голосов
/ 14 июля 2009

У меня есть файл, например "нечто.exe", и я хочу найти путь к этому файлу
Как я могу сделать это в Python?

Ответы [ 5 ]

12 голосов
/ 14 июля 2009

Возможно, os.path.abspath() сделает это:

import os
print os.path.abspath("something.exe")

Если ваш something.exe не находится в текущем каталоге, вы можете передать любой относительный путь и abspath() разрешит его.

11 голосов
/ 14 июля 2009

используйте os.path.abspath , чтобы получить нормализованную абсолютизированную версию пути
используйте os.walk , чтобы узнать его местоположение

import os
exe = 'something.exe'
#if the exe just in current dir
print os.path.abspath(exe)
# output
# D:\python\note\something.exe

#if we need find it first
for root, dirs, files in os.walk(r'D:\python'):
    for name in files:
        if name == exe:
            print os.path.abspath(os.path.join(root, name))

# output
# D:\python\note\something.exe
5 голосов
/ 14 июля 2009

если вы абсолютно не знаете, где он находится, единственный способ найти его, начиная с корня c: \

import os
for r,d,f in os.walk("c:\\"):
    for files in f:
         if files == "something.exe":
              print os.path.join(r,files)

В противном случае, если вы знаете, что храните exe-файлы всего в нескольких местах, например, в своей системе32, начните искать их оттуда. вы также можете использовать os.environ ["PATH"], если вы всегда помещаете свой .exe в один из этих каталогов в вашей переменной PATH.

for p in  os.environ["PATH"].split(";"):
    for r,d,f in os.walk(p):
        for files in f:
             if files == "something.exe":
                 print os.path.join(r,files)
2 голосов
/ 14 июля 2009

Э-э ... Этот вопрос немного неясен.

Что значит "иметь"? У вас есть имя файла? Вы открыли это? Это файловый объект? Это дескриптор файла? Что ???

Если это имя, что вы имеете в виду под словом "найти"? Вы хотите найти файл в куче каталогов? Или вы знаете, в каком каталоге он находится?

Если это файловый объект, то вы, должно быть, открыли его разумно, и затем вы уже знаете путь, хотя вы также можете получить имя файла из fileob.name.

1 голос
/ 06 июня 2018

Просто отметим, что другим вариантом для решения этой задачи может быть модуль subprocess, который поможет нам выполнить команду в терминале, например:

import subprocess

command = "find"
directory = "/Possible/path/"
flag = "-iname"
file = "something.foo"
args = [command, directory, flag, file]
process = subprocess.run(args, stdout=subprocess.PIPE)
path = process.stdout.decode().strip("\n")
print(path)

При этом мы эмулируем передачу следующей команды в Терминал: find /Posible/path -iname "something.foo". После этого, учитывая, что атрибут stdout является двоичной строкой, нам нужно декодировать его и удалить завершающий символ "\ n".

Я протестировал его с магией %timeit в шпионе, и производительность на 0,3 секунды ниже, чем у опции os.walk().

Я заметил, что вы находитесь в Windows, поэтому вы можете искать команду, которая ведет себя подобно find в Unix.

Наконец, если у вас есть несколько файлов с одинаковыми именами в разных каталогах, результирующая строка будет содержать все из них. Следовательно, вам нужно разобраться с этим надлежащим образом, возможно, используя регулярные выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...