2015-10-09 3 views
0

Я хотел бы найти полный путь любого данного файла, но когда я попытался использоватьПоиск файлов Путь в Python

os.path.abspath("file") 

это только дало бы мне местоположение файла, находясь в директории, где программа запущена. Кто-нибудь знает, почему это так, или как я могу получить истинный путь к файлу?

+1

Это должно дать вам абсолютный путь, хотя для относительных путей было бы рассмотреть путь будучи относительно текущего каталога. Можете ли вы привести пример проблемы, которую вы видите? –

+2

Я думаю, что OP хочет предоставить в качестве входного файла «foo.txt» и вернуть ему абсолютный путь, где этот файл находится в файловой системе. Это правильно @ I.A.S. – idjaw

+0

Вы предоставляете подразумеваемый относительный путь и возвращаете абсолютный путь этого относительного пути. Можете ли вы уточнить, какие ожидаемые результаты? –

ответ

2

Что вы ищете, это в конечном итоге поиск в вашей файловой системе. Это не очень хорошо, потому что очень вероятно, что у вас может быть несколько файлов с тем же именем, поэтому вы не будете знать с уверенностью, действительно ли первое совпадение - это тот файл, который вы хотите.

Я приведу вам пример того, как вы можете начать с чего-то простого, что позволит вам проходить через каталоги, чтобы иметь возможность искать.

Вам нужно будет указать какой-то базовый путь, чтобы иметь возможность инициировать поиск, который должен быть сделан для пути, где находится этот файл. Имейте в виду, что чем шире вы, тем дороже ваш поиск будет.

Вы можете сделать это с помощью метода os.walk.

Вот простой пример использования os.walk. Что это делает собрать все пути к файлам с соответствующими именами файлов

Использование os.walk

from os import walk 
from os.path import join 

d = 'some_file.txt' 
paths = [] 
for i in walk('/some/base_path'): 
    if d in i[2]: 
     paths.append(join(i[0], d)) 

Таким образом, для каждой итерации над os.walk вы собираетесь получить кортеж, который содержит:

(path, directories, files) 

Поэтому я проверяю местоположение i[2], чтобы посмотреть файлы. Затем я присоединяюсь к i[0], который является путем, чтобы собрать полное имя пути к файлу.

Наконец, вы можете поместить код выше все в одной строке и сделать:

paths = [join(i[0], d) for i in walk('/some/base_path') if d in i[2]] 
+0

Спасибо, идиот. Прекрасно работает! –