我想通过正斜杠解析路径(不是文件名)。下面采用完整路径“filename”并读取到第7个“/”。
编辑:当我说出文件名时,我意识到上面的内容令人困惑。我的意思是,我需要解析完整的路径。例如我可能需要左边的前7“/”并删除5个尾随“/”s。
的Python:
"/".join(filename.split("/")[:7])
击:
some command that prints filename | cut -d'/' -f1-7`
使用切割工具看起来更干净。有没有更好/更有效的方法在Python中编写它?
答案 0 :(得分: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