Pythonで絶対ファイルパスを取得する方法


回答:


1056
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

それがすでに絶対パスである場合にも機能します:

>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

29
注:ほとんどのプラットフォームでは、これはnormpath()次のように関数を呼び出すことと同じですnormpath(join(os.getcwd(), path))。したがって、mydir/myfile.txtos.getcwd()にない場合、絶対パスは実際のパスではありません
コアナー2014年

32
@coanor?明示的なルートがない場合、mydir/myfile.txtは現在の作業ディレクトリ内のパスを暗黙的に参照するため、と同等./mydir/myfile.txtです。入力したパスではないかもしれませんが、私が知る限り、パスは正しく解釈されているようです。詳しく説明してもらえますか?
jpmc26

2
@ jpmc26私はコアナーを正確にフォローしていませんが、(私が推測したこととは逆に)abspath関数の引数と実際のファイルの間にリンクはないと言っています。パス名を指定することができます。存在しないファイルとディレクトリ階層は問題なく、abspathはパスのビット(親ディレクトリ " .."要素を含む)を解決して文字列を返します。これは、現在のディレクトリから計算された文字列です。実際のファイルとの相関関係は偶然のようです。お試しくださいos.path.abspath("/wow/junk/../blha/hooey")。できます。
Mike S

2
@MikeS正直に言って、なぜそれが予期せぬ振る舞いになるのかわかりません。これは絶対パスであり、絶対ファイルやディレクトリではありません。存在チェックが必要な場合は、を呼び出しますos.path.exists。逆に、PowerShellのような、標準のパス解決機能を使用して既存のパスを要求するシステムは、使いにくいものです。
jpmc26 2018

1
@ jpmc26パスがパス名のように見える単なる文字列であると仮定することはまったく明確ではなく、私が長年パス名について考えたり話したりしてきた方法に反します。私はabspathのPython 3ドキュメントを引用します:「パス名pathの正規化された絶対バージョンを返します。」文字列 パスの "...バージョンではありません。Posixで定義されているパス名は、「ファイルを識別するために使用される文字列」です。Pythonのドキュメントはrelpath、「ファイルシステムにアクセスして、その存在または性質を確認することはできません」と明言していますpath。ここでの議論が明白である場合、なぜ明示的なのrelpathですか?
マイクS

77

新しいPython 3.4ライブラリを使用できますpathlib。(Python 2.6または2.7を使用して取得することもできpip install pathlibます。)著者は次のように書いています。

Windowsで絶対パスを取得するには:

>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'

またはUNIXの場合:

>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'

ドキュメントはこちら:https : //docs.python.org/3/library/pathlib.html


4
非常に役立ちます。を使用os.path.abspath()するとエラーが発生しました:AttributeError: 'NoneType' object has no attribute 'startswith'を使用するPath().resolve()と、同じ相対ファイルパスが使用されません。(LinuxおよびPython3.4)
NuclearPeon 2015

23

さらに良いことに、モジュール(にあります)をインストールすると、PyPIすべてのos.path関数とその他の関連関数が、文字列が使用される場所で使用できるオブジェクトのメソッドにラップされます。

>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>

2
残念なことに、stdlibに適切なファイル名抽象化モジュールを組み込むことはできませんでした。
Torsten Marek

1
@Torsten Marek:それは痛くて長年の省略です。
フロー

4
彼らは今Python 3.4のために行いました:pathlib。このスレッドで私の答えを参照してください。
twasbrillig 2014年

この答えにはyyposがあります。それはする必要がありますfrom path import Path、その後Path('mydir/myfile.txt').abspath()
frakman1

タイプミスはありませんpath。別のモジュールを使用している可能性があります。リンクされたモジュールは、という名前のクラスを使用しますpath
トム・

14

今日、以下unipathに基づいたパッケージを使用することもできますpath.pyhttp : //sluggo.scrapping.cc/python/unipath/

>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>

一般的なos.pathユーティリティへのクリーンなインターフェイスを提供するため、このパッケージの使用をお勧めします


10

pathlib実際に質問に答えるPython 3.4以降の更新:

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object

一時的な文字列のみが必要な場合は、もちろんを含む、のPathすべての関連機能を持つオブジェクトを使用できることに注意してください。os.pathabspath

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object

9
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

expanduserファイル(またはディレクトリ)の名前と場所の指定された式に先頭~/(チルダはユーザーのホームディレクトリを指します)が含まれている可能性がexpandvarsあり、その他の環境変数(など$HOME)を処理する場合、(Unixでは)が必要であることに注意してください。


6

これは、別のスクリプト内から呼び出された場合でも、常に現在のスクリプトの正しいファイル名を取得します。を使用する場合に特に便利ですsubprocess

import sys,os

filename = sys.argv[0]

そこから、次のようにしてスクリプトの完全なパスを取得できます。

>>> os.path.abspath(filename)
'/foo/bar/script.py'

また、追加するだけでフォルダをナビゲートしやすくなります /..、ディレクトリの階層を「上に」行きたい回数ます。

cwdを取得するには:

>>> os.path.abspath(filename+"/..")
'/foo/bar'

親パスの場合:

>>> os.path.abspath(filename+"/../..")
'/foo'

"/.."他のファイル名と組み合わせると、システム内の任意のファイルにアクセスできます。


これは求められていたものではありません。彼らは、現在の作業ディレクトリに関連するパスについて尋ねました。これは、スクリプトディレクトリと同じではありませんが、同じ値になる場合があります。
エレメンタルオブクリエーション

3

モジュールosはabsパスを見つける方法を提供します。

しかし、Linuxのほとんどのパスは~(チルダ)で、満足のいく結果が得られません。

そのために使用できますsrblib

>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'

使用してインストール python3 -m pip install srblib

https://pypi.org/project/srblib/


1

私はグロブを使いたい

現在のフォルダ内のすべてのファイルタイプを一覧表示する方法は次のとおりです。

import glob
for x in glob.glob():
    print(x)

現在のフォルダにあるすべての(たとえば).txtファイルを一覧表示する方法は次のとおりです。

import glob
for x in glob.glob('*.txt'):
    print(x)

選択したディレクトリ内のすべてのファイルタイプを一覧表示する方法は次のとおりです。

import glob
for x in glob.glob('C:/example/hi/hello/'):
    print(x)

これがお役に立てば幸いです


2
あなたは別の質問に答えているようです。「どうやってパスを取得するのか」ではなく「絶対パス」だった。最初の2つのケースで提供されるos.path.abspath()相対パスに正解()を適用できますglob...
NichtJens

1

Macを使用している場合

import os
upload_folder = os.path.abspath("static/img/users")

これはあなたに完全なパスを与えます:

print(upload_folder)

次のパスが表示されます。

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

1

誰かがpythonとlinuxを使用していて、ファイルへのフルパスを探している場合:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.