8

私には道があります:

path = foo/bar/baz

そして、私はベースが何であるかを決定したいと思います。この例では、「foo」を返す必要があります。

私が試したいくつかの方法があります:

root = re.search('(.+?)/(.+)', path).group(1)

paths = path.split('/')[0]
root = paths[0] if paths[0] or len(paths) <= 1 else '/'.join(paths[0:2])

def rootname(path):
  head,tail = os.path.split(path)
  if head != '':
   return rootname(head)
  else:
   return path
root = rootname(path)

ルートディレクトリにアクセスするためのより「Pythonic」な方法はありますか?

すなわち

root = os.path.''rootname''(path)
4

6 に答える 6

15
>>> import os
>>> path = '/foo/bar/baz'
>>> path = path.lstrip(os.sep)  # Get rid of leading "/" if any
>>> root = path[:path.index(os.sep)] if os.sep in path else path
>>> root
'foo'
于 2013-12-08T02:17:09.023 に答える
3

あなたがまさにあなたが望むことをするビルトインまたはstdlib関数を探しているなら、何もありません。

サードパーティのライブラリを探している場合は、PyPIとActiveStateを検索してみてください。pathlib(Python 3.4以降に含まれている)、Unipathforked-path以前のライブラリに基づいており、その修正バージョンは検討されましたが、Python 2に含めることはできませんでした)などのパス操作ライブラリがあります。(または、またはのようなフレームワークを使用している場合は、フレームワークがtwisted組み込まPyQtれている可能性があります。)

このようなライブラリを使用すると、通常、次のように1行でルートパスを取得できます。

pathlib.Path(mypath).parts[0]
Unipath.Path(mypath).split_root()[0]
Unipath.Path(mypath).components()[0]
path.path(mypath).splitall()[0]

それらの「ルート」の定義は、あなたの定義とまったく同じではない可能性があります。(JFセバスティアンが指摘しているように、「ルート」の定義が実際には正確にわからないため、一致するかどうかを推測するのは困難です…)したがって、この種のコードが必要になる場合があります。

components = path.path(mypath).splitall()[0]
return components[0] if len(components[0]) > 1 else components[0]/components[1]

ただし、それでも、正規表現や文字列操作を行うよりはましです。

(実際、サードパーティのライブラリを使用しないos.path場合でも、文字列関数ではなく関数からすべてを構築するようにしてください。そうすれば、来年Windowsで試してみると、うまくいく可能性が高くなります。箱から出して動作します。そうでない場合は、動作しないことが絶対に保証されているのではなく、おそらく小さな変更のみが必要であり、完全な書き換えが必要になる可能性があります。)

于 2012-12-18T23:13:43.320 に答える
1

要件を理解している場合は、相対パスでない限り、ルートディレクトリからディレクトリを削除し、相対パスからディレクトリを削除しますか?そのようなものを処理するための組み込み関数は見つかりません。しかし、それが本当に必要なものである場合は、2番目の「方法」のようなものを使用してください。ただし、「/」の代わりにos.path.sepを使用します。

于 2012-12-18T20:17:02.740 に答える
1

ルートのサブディレクトリを取得するには、パスが属します—「ベース」ディレクトリ:

p = os.path
unc, rest = getattr(p, 'splitunc', lambda s: ('', s))(p.abspath(path))
drive, rest = p.splitdrive(rest)
basedir = p.join(unc, drive, p.sep, rest and rest.split(p.sep, 2)[1])

Unixでは、コードを簡略化できます。splitunc()splitdrive()は省略できます。

于 2012-12-18T21:12:25.300 に答える
1

ピーターの答えに似ています:

root = path.lstrip(os.sep).split(os.sep)[0]
于 2020-01-27T11:18:39.110 に答える
0

ワンライナーos.path.splitdrive(checkedpath)[0]

于 2014-11-05T14:37:00.333 に答える