Pythonでパスの最後の部分のみを取得する方法は?


233

Pythonでは、次のようなパスがあるとします。

/folderA/folderB/folderC/folderD/

どうすればfolderD部品だけを入手できますか?

回答:


389

os.path.normpath次に、を使用しますos.path.basename

>>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

1つ目は末尾のスラッシュを取り除き、2つ目はパスの最後の部分を示します。を使用するとbasename、最後のスラッシュ(この場合は)の後のすべてが表示され''ます。


1
私が最初に思ったrstrip('/')より単純だろうが、その後すぐに私が使用する必要があるだろう実現rstrip(os.path.sep)ので、明らかの使用は、normpath正当化されます。
エリックカプルン2014年

これは、Windowsの長いパス、例えば、上で動作するようには思えない'\\\\?\\D:\\A\\B\\C\\''\\\\?\\UNC\\svr\\B\\C\\'(リターン空の文字列) このソリューションは、すべてのケースで動作します。
omasoud

25

あなたができる

>>> import os
>>> os.path.basename('/folderA/folderB/folderC/folderD')

UPDATE1:この方法は、/ folderA / folderB / folderC / folderD / xx.pyを指定した場合に機能します。これにより、xx.pyがベース名として与えられます。これは私が推測するものではありません。だからあなたはこれを行うことができます-

>>> import os
>>> path = "/folderA/folderB/folderC/folderD"
>>> if os.path.isdir(path):
        dirname = os.path.basename(path)

UPDATE2:larsが指摘したように、末尾の「/」に対応するように変更を加えます。

>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

Pythonの考え方では、os.path.basename( "... /")は正しく ''を生成します。はい、私もその次善を見つけます。ただし、以下の... basename(... normpath ...ソリューションは標準的なものです
Cameron Laird

@lars yeah!その場合は、パスをbasenameに送る前に、まずパスを正規化することを確認しました。os.path.basename(os.path.normpath( '/ folderA / folderB / folderC / folderD /'))
Srikar Appalaraju

UPDATE2は、これまでに見つけた最良のアプローチです。
akki

23

Python 3では、pathlibモジュールを使用できます(pathlib.PurePath例):

>>> import pathlib

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/')
>>> path.name
'folderD'

ファイルが置かれている最後のフォルダー名が必要な場合:

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
>>> path.parent.name
'folderD'

18

これが私のアプローチです:

>>> import os
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/test.py'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD'))
folderC

1
あなたのアプローチは前述のものと異なる/より良い解決策は何ですか?
user1767754

9

私はファイルが配置されている最後のフォルダー名を取得するための解決策を探していましたsplitが、正しい部分を取得するために2回だけ使用しました。それは問題ではありませんが、グーグルは私をここに転送しました。

pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + "   "  + tail)

2

素朴な解決策(Python 2.5.2+):

s="/path/to/any/folder/orfile"
desired_dir_or_file = s[s.rindex('/',0,-1)+1:-1] if s.endswith('/') else s[s.rindex('/')+1:]

なぜ誰もがこれを使用するのですか?
Chris_Rands 2018年

1

このためのパスのパーツメソッドが好きです。

grandparent_directory, parent_directory, filename = Path(export_filename).parts[-3:]
log.info(f'{t: <30}: {num_rows: >7} Rows exported to {grandparent_directory}/{parent_directory}/{filename}')


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.