我有一条看起来像的路
/First/Second/Third/Fourth/Fifth
Run Code Online (Sandbox Code Playgroud)
我想从中删除First
它,从而获得
Second/Third/Fourth/Fifth
Run Code Online (Sandbox Code Playgroud)
我能提出的唯一想法是递归使用,os.path.split
但这似乎不是最佳的.有更好的解决方案吗?
aba*_*ert 40
os.path
模块中没有任何东西可以做到这一点.每隔一段时间,有人建议创建一个splitall
函数来返回所有组件的列表(或迭代器),但它从未获得足够的牵引力.
部分原因是因为每次有人建议添加新功能时os.path
,都会重新点燃对库的一般设计的长期不满,导致有人提出一个新的,更像OO的API,用于弃用os的路径,笨重的API.在3.4中,终于发生了这种情况pathlib
.而且它已经拥有了不存在的功能os.path
.所以:
>>> import pathlib
>>> p = pathlib.Path('/First/Second/Third/Fourth/Fifth')
>>> p.parts[2:]
('Second', 'Third', 'Fourth', 'Fifth')
>>> pathlib.Path(*p.parts[2:])
PosixPath('Second/Third/Fourth/Fifth')
Run Code Online (Sandbox Code Playgroud)
或者......你确定你真的想删除第一个组件,而不是这样做吗?
>>> p.relative_to(*p.parts[:2])
PosixPath('Second/Third/Fourth/Fifth')
Run Code Online (Sandbox Code Playgroud)
如果您需要在2.6-2.7或3.2-3.3中执行此操作,则会有一个backportpathlib
.
当然,您可以使用字符串操作,只要您小心地规范路径和使用os.path.sep
,并确保使用非绝对路径或带有驱动器号的系统处理繁琐的细节,并且......
或者你可以结束你的递归os.path.split
.一旦你把它包起来,它究竟是什么"非最佳"呢?它可能有点慢,但我们在这里谈论纳秒,比甚至调用stat
文件快许多个数量级.如果你有一个1000个目录深的文件系统,它会有递归深度问题,但你见过一个吗?(如果是这样,你总是可以把它变成一个循环...)它需要几分钟的时间来完成它并编写好的单元测试,但这只是你做过一次而不再担心的事情.所以,老实说,如果你不想使用pathlib
,那就是我要做的.
小智 17
有点像另一个答案,利用os.path:
os.path.join(*(x.split(os.path.sep)[2:]))
Run Code Online (Sandbox Code Playgroud)
...假设你的字符串以分隔符开头.
一个简单的方法
a = '/First/Second/Third/Fourth/Fifth'
"/".join(a.strip("/").split('/')[1:])
Run Code Online (Sandbox Code Playgroud)
输出:
Second/Third/Fourth/Fifth
Run Code Online (Sandbox Code Playgroud)
在上面的代码我已经分裂了字符串.然后加入离开第一个元素
使用itertools.dropwhile
:
>>> a = '/First/Second/Third/Fourth/Fifth'
>>> "".join(list(itertools.dropwhile(str.isalnum, a.strip("/"))[1:])
'Second/Third/Fourth/Fifth'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22087 次 |
最近记录: |