2009-05-22 19 views
2

在Python中「向上」查找文件的最佳方式是什麼? (理想情況下,它也可以在Windows上運行)。例如,如何在Python中向上查找文件?

>>> 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標準庫中沒有任何東西(雖然我很想被證明是錯誤的)。另外,使用谷歌搜索並沒有太多的確定性;我想知道是否有「大家」使用的東西。

回答

4
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

模塊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:添加代碼。

+1

os.isfile()不是一個函數。試試os.path.isfile()。 – nosklo 2009-05-22 20:21:23

0

我發現自己需要類似的node.js版本findup功能的同時,選擇了一種遞歸實現:

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)