web-dev-qa-db-ja.com

Pythonでファイルパスからフォルダパスを抽出するにはどうすればよいですか?

ファイルへのフルパスからフォルダーパスのみを取得したいと思います。

たとえば、T:\Data\DBDesign\DBDesign_93_v141b.mdbで、T:\Data\DBDesignのみを取得したい(\DBDesign_93_v141b.mdbを除く)。

私はこのようなものを試しました:

existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = str(existGDBPath.split('\\')[0:-1])
print wkspFldr 

しかし、それは私に次のような結果を与えました:

['T:', 'Data', 'DBDesign']

これは私が必要とする結果ではありません(T:\Data\DBDesignである)。

ファイルへのパスを取得する方法に関するアイデアはありますか?

89
Genspec

split関数を使用してほとんどそこにいました。次のように、文字列を結合する必要がありました。

>>> import os
>>> '\\'.join(existGDBPath.split('\\')[0:-1])
'T:\\Data\\DBDesign'

os.path.dirname関数を使用してこれを行うことをお勧めしますが、文字列を渡すだけで、作業は自動的に行われます。あなたは窓にいるように見えるので、abspath関数の使用も検討してください。例:

>>> import os
>>> os.path.dirname(os.path.abspath(existGDBPath))
'T:\\Data\\DBDesign'

分割後にファイル名とディレクトリパスの両方が必要な場合は、次のように、タプルを返すos.path.split関数を使用できます。

>>> import os
>>> os.path.split(os.path.abspath(existGDBPath))
('T:\\Data\\DBDesign', 'DBDesign_93_v141b.mdb')
108
Sukrit Kalra

os.path モジュールを使用します。

>>> import os
>>> existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
>>> wkspFldr = os.path.dirname(existGDBPath)
>>> print wkspFldr 
'T:\Data\DBDesign'

先に進み、何らかのファイル名操作を行う必要がある場合は、os.pathで既に実装されていると想定できます。そうでない場合でも、おそらくこのモジュールをビルディングブロックとして使用する必要があります。

UPDATE

新規開発には pathlib の使用を検討する必要があります。 Python3.4ではstdlibにありますが、以前のバージョンでは PyPIで利用可能 です。このライブラリは、パスを操作するためのよりオブジェクト指向のメソッド<opinion>を提供し、</opinion>を使用した読み取りとプログラミングがはるかに簡単です。

>>> import pathlib
>>> existGDBPath = pathlib.Path(r'T:\Data\DBDesign\DBDesign_93_v141b.mdb')
>>> wkspFldr = existGDBPath.parent
>>> print wkspFldr
Path('T:\Data\DBDesign')
74
SethMMorton

組み込みサブモジュール os.path には、まさにそのタスクのための機能があります。

import os
os.path.dirname('T:\Data\DBDesign\DBDesign_93_v141b.mdb')
34
Dan Allan

コードは次のとおりです。

import os
existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = os.path.dirname(existGDBPath)
print wkspFldr # T:\Data\DBDesign
3
Victor Lellis

ESRI GISテーブルフィールド電卓インターフェイスでこれを行おうとする人は誰でもPythonパーサーでこれを行うことができます。

PathToContainingFolder =

"\\".join(!FullFilePathWithFileName!.split("\\")[0:-1])

そのため

\ Users\me\Desktop\New folder\file.txt

になる

\ Users\me\Desktop\Newフォルダー

0
Zipper1365

これは、パスintファイル、パストークンを分割するための小さなユーティリティヘルパーです。

import os    
# usage: file, path = splitPath(s)
def splitPath(s):
    f = os.path.basename(s)
    p = s[:-(len(f))-1]
    return f, p
0