0

スラッシュでパス(ファイル名ではなく)を解析したい。以下はフルパス「filename」を取り、7番目の「/」まで読み取ります。

編集:私がファイル名を述べたとき、私は上記が混乱していることに気づきました。つまり、フルパスを解析する必要がありました。たとえば、左側に最初の7つの「/」が必要で、末尾の5つの「/」を削除できます。

Python:

"/".join(filename.split("/")[:7])

バッシュ:

some command that prints filename | cut -d'/' -f1-7`

カットツールでとてもきれいに見えます。Pythonでこれを書くためのより良い/より効率的な方法はありますか?

4

1 に答える 1

5

通常、os.pathパスを処理するためにモジュールの関数を使用することをお勧めします。有効なパスで発生する可能性のあるすべてのエッジケースをライブラリに処理させることを好みます。

コメントで指摘したようにos.path.split()、最後のパス要素だけを分割します。それを使用するには、次のように書くことができます。

l = []
while True:
    head, tail = os.path.split(filename)
    l.insert(0, tail)
    if head == "/":
        l.insert(0, "")
        break
    filename = head
"/".join(l[:7])

より冗長ですが、これにより、スラッシュの重複などのアーティファクトが正しく正規化されます。

一方、の使用はstring.split()のセマンティクスと一致しますcut(1)


サンプルテストケース:

$ echo '/a/b/c/d/e/f/g/h' | cut -d'/' -f1-7 
/a/b/c/d/e/f

$ echo '/a/b/c/d/e/f/g/h/' | cut -d'/' -f1-7 
/a/b/c/d/e/f

$ echo '/a//b///c/d/e/f/g/h' | cut -d'/' -f1-7
/a//b///c

# Tests and comparison to string.split()

import os.path

def cut_path(filename):
    l = []
    while True:
        head, tail = os.path.split(filename)
        l.insert(0, tail)
        if head == "/":
            l.insert(0, "")
            break
        filename = head
    return "/".join(l[:7])

def cut_string(filename):
    return "/".join( filename.split("/")[:7] )

def test(filename):
    print("input:", filename)
    print("string.split:", cut_string(filename))
    print("os.path.split:", cut_path(filename))
    print()

test("/a/b/c/d/e/f/g/h")
test("/a/b/c/d/e/f/g/h/")
test("/a//b///c/d/e/f/g/h")

# input: /a/b/c/d/e/f/g/h
# string.split: /a/b/c/d/e/f
# os.path.split: /a/b/c/d/e/f
#
# input: /a/b/c/d/e/f/g/h/
# string.split: /a/b/c/d/e/f
# os.path.split: /a/b/c/d/e/f
#
# input: /a//b///c/d/e/f/g/h
# string.split: /a//b///c
# os.path.split: /a/b/c/d/e/f
于 2013-03-19T00:50:15.100 に答える