での作業:相対パス
c:\Program Files\foo\bar\scripy.py
にはどうすればディレクトリ'foo'
を参照することができますか?
相対パスを使用する便利な方法はありますか?
以前は文字列モジュールを使っていましたが、もっと良い方法が必要です(os.path
に見つかりませんでした)。
での作業:相対パス
c:\Program Files\foo\bar\scripy.py
にはどうすればディレクトリ'foo'
を参照することができますか?
相対パスを使用する便利な方法はありますか?
以前は文字列モジュールを使っていましたが、もっと良い方法が必要です(os.path
に見つかりませんでした)。
os.path.dirname(path)
行われるSPLITの後半を返します。 pathパラメータに設定します。 (head - ディレクトリとテール、ファイル)単純に、パスが入っているディレクトリを返します。これを2回実行する必要がありますが、おそらくこれが最善の方法です。 path
機能に
Pythonのドキュメントは:
ありがとうございました。 – Dominik
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(), ".."))
これは少しトリッキーです。たとえば、次のコード:
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()は役に立ちませんでした。
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')
ぞっとするための3つの喝采! – cledoux