Как найти файл вверх в Python? - PullRequest
2 голосов
/ 22 мая 2009

Каков наилучший способ найти файл "вверх" в Python? (В идеале это будет работать и на Windows). Например.,

>>> os.makedirs('/tmp/foo/bar/baz/qux')
>>> open('/tmp/foo/findme.txt', 'w').close()
>>> os.chdir('/tmp/foo/bar/baz/qux')
>>> findup('findme.txt')
'/tmp/foo/findme.txt'

Насколько я могу судить, в стандартной библиотеке Python нет ничего (хотя я бы хотел оказаться ошибочным). Кроме того, поиск в Google не обнаружил много, что является окончательным; Мне интересно, есть ли что-то, что "все" используют.

Ответы [ 3 ]

4 голосов
/ 22 мая 2009
import os

def findup(filename):
    drive, thisdir = os.path.splitdrive(os.getcwd())
    while True:
        fullpath = os.path.join(drive, thisdir, filename)
        if os.path.isfile(fullpath):
            return fullpath
        if thisdir == os.path.sep: #root dir
            raise LookupError('file not found: %r' % filename)
        thisdir = os.path.dirname(thisdir)

os.makedirs('/tmp/foo/bar/baz/qux')
open('/tmp/foo/findme.txt', 'w').close()
os.chdir('/tmp/foo/bar/baz/qux')
print findup('findme.txt')

Печать:

/tmp/foo/findme.txt

Также работает в Windows. Вероятно, будет работать на любой платформе.

1 голос
/ 22 мая 2009

Модуль os.path имеет то, что вам нужно, в частности: abspath () (если путь не абсолютный), dirname (), isfile () и join ().

dir = os.path.curdir()
filename = None
while True:
    filename = os.path.join(dir, 'filename')
    if os.path.isfile(filename):
        break
    updir = os.path.dirname(dir)
    if updir == dir:
        filename = None
        break
    dir = updir

Редактировать: изменить posixpath на os.path, чтобы это работало в Windows.

Редактировать x2: добавить код.

0 голосов
/ 22 марта 2015

Я обнаружил, что мне нужна функция findup, аналогичная версии node.js, и выбрал рекурсивную реализацию:

import os

def findup(filename, dir = os.getcwd()):
    def inner(drive, dir, filename):
        filepath = os.path.join(drive, dir, filename)
        if os.path.isfile(filepath):
            return filepath
        if dir == os.path.sep:
            raise LookupError('file not found: %s' % filename)
        return inner(drive, os.path.dirname(dir), filename)
    drive, start = os.path.splitdrive(os.path.abspath(dir))
    return inner(drive, start, filename)    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...