2011-07-22 24 views
1

での作業:相対パス

c:\Program Files\foo\bar\scripy.py 

にはどうすればディレクトリ'foo'を参照することができますか?

相対パスを使用する便利な方法はありますか?

以前は文字列モジュールを使っていましたが、もっと良い方法が必要です(os.pathに見つかりませんでした)。

+0

ぞっとするための3つの喝采! – cledoux

答えて

1
os.path.dirname(path) 

行われるSPLITの後半を返します。 pathパラメータに設定します。 (head - ディレクトリとテール、ファイル)単純に、パスが入っているディレクトリを返します。これを2回実行する必要がありますが、おそらくこれが最善の方法です。 path機能に

Pythonのドキュメントは:

http://docs.python.org/library/os.path#os.path.expanduser

+0

ありがとうございました。 – Dominik

4

os.pathモジュールには、このようなパスで作業するためのさまざまな機能が含まれています。ほとんどのオペレーティング・システムの規則では、あなたがこれを行うことが外部のディレクトリを取得するには、「1つのレベルアップ」行き..を使用することです:

import os 
import os.path 

current_dir = os.getcwd() # find the current directory 
print current_dir # c:\Program Files\foo\bar\scripy.py 

parent = os.path.join(current_dir, "..") # construct a path to its parent 
print parent # c:\Program Files\foo\bar\.. 

normal_parent = os.path.normpath(parent) # "normalize" the path 
print normal_parent # c:\Program Files\foo 

# or on one line: 
print os.path.normpath(os.path.join(os.getcwd(), "..")) 
0

これは少しトリッキーです。たとえば、次のコード:

import sys 
import os 

z = sys.argv[0] 
p = os.path.dirname(z) 
f = os.path.abspath(p) 

print "argv[0]={0} , dirname={1} , abspath={2}\n".format(z,p,f) 

は、まず第一 argv[0]=../zzz.py , dirname=.. , abspath=C:\Users\michael\Downloads

Windows上でこの出力を与えるが、そのARGVは私がコマンド python ../zzz.pyで入力し、絶対パスは、通常のWindowsを持っているスラッシュを持って気づきますバックスラッシュ。クロスプラットフォームにする必要がある場合は、Pythonのコマンドラインに通常のスラッシュを入れないでください。そして、 os.sepを使用して、パス名のコンポーネントを区切った文字を参照してください。

これまでのところ、私はあなたの質問に部分的に答えました。 fの値を使用して必要なものを取得するには、いくつかの方法があります。 Unix上でWindows上C:\Users\michael\Downloads\..\../home/michael/../..のようなものになるでしょう

targetpath = f + os.sep + ".." + os.sep + ".." 

:ブルートフォースのようなものを使用することです。それぞれは1ステップ前に戻り、パス名コンポーネントを削除するのと同じです。

しかし、あなたがパスを分割することで、より良い行うことができます:

target = f.split(os.sep) 
targetpath = os.sep.join(target[:-2] 

とUnix上でWindows上C:\Users/を取得するために、最後の2ビットが、すべてを再結合します。そうするなら、削除するのに十分なパス名コンポーネントがあるかどうかを確認することをお勧めします。

上記のプログラムは、python ../xxx.pyと入力して実行しました。つまり、私はスクリプトと同じ作業ディレクトリにいなかったので、getcwd()は役に立ちませんでした。

0

the unipath libraryの代わりにos.pathを最近使用し始めました。パスのそのオブジェクト指向表現がはるかに簡単です:

from unipath import Path 

original = Path(__file__) # .absolute() # r'c:\Program Files\foo\bar\scripy.py' 
target = original.parent.parent 

print target # Path(u'c:\\Program Files\\foo') 

Pathはそうあなたが標準のファイルシステム関数で使用することができstrのサブクラスですが、それはまた、それらの多くのための選択肢を提供します。

print target.isdir() # True 

numbers_dir = target.child('numbers') 

print numbers_dir.exists() # False 
numbers_dir.mkdir() 
print numbers_dir.exists() # True 

for n in range(10): 
    file_path = numbers_dir.child('%s.txt' % (n,)) 
    file_path.write_file("Hello world %s!\n" % (n,), 'wt')