2009-05-22 7 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 

編集:これはWindowsで動作するようにos.pathに変更します。

x2を編集:コードを追加します。

+1

os.isfileは()関数ではありません。 os.path.isfile()を試してください。 – nosklo

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)  
関連する問題