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

nvbavucw  于 2022-12-28  发布在  Python
关注(0)|答案(5)|浏览(199)

我有一条路径看起来像

/First/Second/Third/Fourth/Fifth

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

Second/Third/Fourth/Fifth

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

ioekq8ef

ioekq8ef1#

os.path模块中确实没有什么东西可以做到这一点。有时候,有人建议创建一个splitall函数,返回所有组件的列表(或迭代器),但它从来没有得到足够的关注。
部分原因是每次有人建议给os.path添加新功能时,它都会重新点燃长期以来对库的总体设计的不满,导致有人提出一个新的、更像OO的API,作为弃用操作系统、笨重API的路径。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')

或者...您确定要删除第一个组件,而不是执行此操作吗?

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

如果您需要在Python 2.6-2.7或Python 3.2-3.3中执行此操作,可以使用backport of pathlib
当然,您可以使用字符串操作,只要您小心地规范化路径并使用os.path.sep,并且确保您处理了非绝对路径或具有驱动器号的系统的复杂细节,以及...
或者你可以结束你的递归os.path.split。当你结束它的时候,它到底是什么“非最优”的呢?它可能会慢一点,但是我们在这里谈论的是纳秒,甚至比在一个文件上调用stat快很多数量级。如果你有一个1000个目录深的文件系统,它会有递归深度的问题,但是你见过这样的问题吗?(如果是这样的话,你可以把它变成一个循环......)它需要花几分钟的时间来总结它并编写好的单元测试,但这是你只需做一次就永远不用担心的事情。所以,老实说,如果你不想使用pathlib,那就是我会做的。

kg7wmglp

kg7wmglp2#

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

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

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

tquggr8v

tquggr8v3#

一个简单的方法

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

muk1a3rh4#

您可以尝试:

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

eaf3rand5#

我在想是否有一种本土的方法来做这件事,但似乎没有。
我知道这个主题已经很老了,但这是我找到最佳解决方案的方法:基本上有两种方法:使用split()和len(),两者都必须使用切片。
1)使用拆分()

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秒---

  • 即使使用“if”来检查路径是否以文件名开头,它的速度也是第一种方法的两倍。

总结一下:每种方法都有优点和缺点。如果你对你要删除的文件夹有绝对的把握,那么就使用方法二,否则我建议使用方法一,这里的人之前已经提到过了。

相关问题