2017-07-09 48 views
3

这个问题其实很简单,但我想知道是否有一种特别优雅的方式可以解决它,我忽略了它。从路径剥离文件名(但仅当路径指向文件时)

考虑我得到一个可以指向目录或文件的路径(例如从用户通过控制台输入),例如,以下

/directory1/directory2/file.txt 
/directory1/directory2 

现在我想写除掉从路径结束一个潜在的文件名代码之一,但目录名,所以,在例如两个路径将减少到/directory1/directory2

  • 我认为os.path.dirname,但始终除掉最后一个路径组件,即使它是一个目录
  • 显而易见的解决方案是使用os.path.isdiros.path.isfile和钢带有条件
  • 我想知道:是否有更短的版本可用,如os.path.closest_dirname
    什么可能的错误我这里有点是os.path.dirname返回最接近的目录,而是将始终返回上一级目录(即作品更像os.path.parentdir
+0

是保证有一个'.format'在文件名结束? – PYA

+0

[This answer](https://stackoverflow.com/questions/7781545/how-to-get-all-folder-only-in-a-given-path-in-python)可能有帮助 –

+1

@Prith:不,我只是为了清楚而添加它(所以很明显它意味着一个文件)。我认为只有在查看名称时模糊才是'os.path.dirname'的原因,因为它的确如此...... –

回答

2

os.path中没有什么东西可以直接做你正在寻找的东西。

我看不出有什么太大毛病,虽然以下几点:

print(path if os.path.isdir(path) else os.path.dirname(path)) 
+0

它并没有真正解决这个问题,但它毕竟是最简单的选择,即使对于我来说,在问题中可能看起来有点不雅。如果这就是Python的设计方式,我们可能不得不忍受它... –

0

可以使用pathlib模块,作为替代到os.path

In [1644]: from pathlib import Path 

In [1645]: def foo(path): 
     ...:  p = Path(path) 
     ...:  return str(p.parents[0]) if p.is_file() else str(p) 
     ...: 

In [1646]: foo('/Users/coldspeed/Desktop/test.txt') 
Out[1646]: '/Users/coldspeed/Desktop' 

In [1647]: foo('/Users/coldspeed/Desktop') 
Out[1647]: '/Users/coldspeed/Desktop' 

这适用于有效的文件路径只有。

+1

我在这里看不到'pathlib'的必要性,因为您仍然需要检查路径是一个文件或一个目录。另外,如果你打算在目录中使用尾部斜线,'os.path.split(...)[0]'都已经完成了。 –

+0

@MosesKoledoye它的工作方式也没有结尾的斜线。 –

0

我会用parts而不是parents

from pathlib import Path 

def foo(path): 
    p = Path(path) 
    return p.parts[-1] # returns last part of path which is stripped filename