删除路径中的第一个文件夹

时间:2014-11-03 22:16:20

标签: python path

我的路径看起来像

/First/Second/Third/Fourth/Fifth

我想从中移除First,从而获得

Second/Third/Fourth/Fifth

我能提出的唯一想法是递归使用os.path.split,但这似乎不是最佳的。有更好的解决方案吗?

5 个答案:

答案 0 :(得分:27)

os.path模块中确实没有任何内容可以执行此操作。有时人们建议创建一个splitall函数来返回所有组件的列表(或迭代器),但它从未获得足够的牵引力。

部分原因是因为每次有人建议为os.path添加新功能时,都会重新点燃对图书馆总体设计的长期不满,导致有人提出一个新的,更像OO的,用于弃用os,clunky API的路径的API。在3.4中,最终发生了pathlib。并且它已经具有os.path中没有的功能。所以:

>>> 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')

或者......你确定你真的想删除第一个组件,而不是这样做吗?

>>> p.relative_to(*p.parts[:2])
PosixPath('Second/Third/Fourth/Fifth')

如果您需要在2.6-2.7或3.2-3.3中执行此操作,那么backport of pathlib

当然,您可以使用字符串操作,只要您注意规范路径并使用os.path.sep,并确保使用非绝对路径或系统处理繁琐的细节用驱动器号,和...

或者你可以结束你的递归os.path.split。究竟是什么"非最佳"关于它,一旦你把它包起来?它可能有点慢,但我们在这里谈论纳秒,比在文件上调用stat快许多个数量级。如果你的文件系统有1000个目录,那么它会有递归深度问题但是你见过一个吗? (如果是这样,你总是可以把它变成一个循环...)它需要几分钟的时间来完成它并编写好的单元测试,但这只是你做过一次而不再担心的事情。所以,老实说,如果你不想使用pathlib,那就是我的所作所为。

答案 1 :(得分:13)

有点像另一个答案,利用os.path:

os.path.join(*(x.split(os.path.sep)[2:]))

...假设你的字符串以分隔符开头。

答案 2 :(得分:7)

一种简单的方法

a = '/First/Second/Third/Fourth/Fifth'
"/".join(a.strip("/").split('/')[1:])

输出:

Second/Third/Fourth/Fifth

在上面的代码中,我已经拆分了字符串。然后加入离开第一个元素

使用itertools.dropwhile

>>> a = '/First/Second/Third/Fourth/Fifth'
>>> "".join(list(itertools.dropwhile(str.isalnum, a.strip("/"))[1:])
'Second/Third/Fourth/Fifth'

答案 3 :(得分:1)

我在寻找是否有本地方式来做,但似乎它没有。

我知道这个主题已经过时了,但这是我为了让我找到最佳解决方案而做的事情: 基本上有两种方法:使用split()和使用len()。两者都必须使用切片。

1)使用split()

import time

start_time = time.time()

path = "/folder1/folder2/folder3/file.zip"
for i in xrange(500000):
    new_path = "/" + "/".join(path.split("/")[2:])

print("--- %s seconds ---" % (time.time() - start_time))

结果:--- 0.420122861862秒---

*删除字符" /"在行new_path =" /" +" /" ....没有太多提高性能。

2)使用len()。 此方法仅在您提供要删除的文件夹时才有效

import time

start_time = time.time()

path = "/folder1/folder2/folder3/file.zip"
folder = "/folder1"
for i in xrange(500000):
    if path.startswith(folder):
        a = path[len(folder):]

print("--- %s seconds ---" % (time.time() - start_time))

结果:--- 0.199596166611秒---

*即便如此"如果"检查路径是否以文件名开头,它的速度是第一种方法的两倍。

总结:每种方法都有pro和con。如果您完全确定要删除的文件夹使用方法二,否则我建议使用此处提到的方法1。

答案 4 :(得分:1)

您可以尝试:

os.path.relpath(your_path, '/First')