通常、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