パスがPythonでクロスプラットフォームの方法で絶対パスまたは相対パスであるかどうかを確認するにはどうすればよいですか?


142

UNIXの絶対パスは「/」で始まりますが、Windowsはアルファベットの「C:」または「\」で始まります。Pythonには、パスが絶対パスか相対パスかをチェックする標準関数がありますか?

回答:


207

os.path.isabsTrueパスが絶対パスの場合は戻り、Falseそうでない場合は戻ります。ドキュメントには、Windowsで動作することが記載されています(個人的にはLinuxで動作することを確認できます)。

os.path.isabs(my_path)

1
この機能はクロスプラットフォームではありません。Unixではos.path.isabs('c:\\')Falseを返します。
anatly techtonik

69
Rotfl。C:\\はUnixシステムでは絶対パスではないため、Falseを返します。UNIXプラットフォームでの絶対パスは、「/」で始まります(「/ var / custApp /」など)。)
Marek Lewandowski

29
@techtonikこれを他の人に完全に明らかにするために: `c:\`はUNIXでは完全に有効なファイル/ディレクトリ名です。したがって、それは本当にUNIXシステム上の相対パスになります。したがって、関数はクロスプラットフォームです。なぜなら、それはWindowsとUnixの専門性を考慮に入れているからです。
Lemming

1
丁度。異なるプラットフォームでは同じように動作せず、現在のプラットフォームに対して正しい答えを提供します。
Kevin Cox

質問に答えません。クロスプラットフォームのルールではなく「はos.path」の「ntpath」または「posixpath」を使用していると
Shoham

43

そして、本当に必要なのが絶対パスである場合、それがそうであるかどうかを確認するためにわざわざチェックしないでくださいabspath

import os

print os.path.abspath('.')

7
それは元の質問に答えていなかったかもしれませんが、それを実現せずに私が探していたものとまったく同じです。ありがとう!
メフィスト2013



5

実際、私は上記の答えのどれも本当の問題に対処していないと思います:クロスプラットフォームパス。os.pathは、OSに依存するバージョンの「パス」ライブラリをロードします。したがって、解決策は関連する(OS)パスライブラリを明示的にロードすることです。

import ntpath
import posixpath

ntpath.isabs("Z:/a/b/c../../H/I/J.txt")
    True
posixpath.isabs("Z:/a/b/c../../H/I/J.txt")
    False

はい!この質問では、WindowsとLinuxの両方のパスについて具体的に言及しています。ほぼすべてのセットアップで機能する簡単なワンライナー: def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
Oliver Zendel

4

python 3.4 pathlibから利用できます。

In [1]: from pathlib import Path

In [2]: Path('..').is_absolute()
Out[2]: False

In [3]: Path('C:/').is_absolute()
Out[3]: True

In [4]: Path('..').resolve()
Out[4]: WindowsPath('C:/the/complete/path')

In [5]: Path('C:/').resolve()
Out[5]: WindowsPath('C:/')

1
この答えは実際にはWindowsで機能します。Path('\tmp').is_absolute()正しく与えるFalse一方でos.path.isabs('\tmp')、正しく与えませんTrue。(\tmpWindowsでは絶対パスであると主張する人もいますが、これは絶対パスの非常に役に立たない定義にのみ当てはまります。)
Zbyl

0

別の方法では、現在の作業ディレクトリにいない場合、ちょっと汚いですが、私にとってはうまくいきます。

import re
path = 'my/relative/path'
# path = '..my/relative/path'
# path = './my/relative/path'

pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.