如何在Python中从文件路径中提取文件夹路径?

206

我想从文件的完整路径中获取文件夹路径。

例如,T:\Data\DBDesign\DBDesign_93_v141b.mdb,我只想得到T:\Data\DBDesign(不包括\DBDesign_93_v141b.mdb)。

我尝试了类似以下代码:

existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = str(existGDBPath.split('\\')[0:-1])
print wkspFldr 

但是它给我返回了这样的结果:
['T:', 'Data', 'DBDesign']

这不是我需要的结果(即T:\ Data \ DBDesign)。

你有什么想法,如何获取文件路径?

7个回答

216
你在使用split函数方面已经接近成功了,只需要像下面这样连接字符串即可。
>>> import os
>>> '\\'.join(existGDBPath.split('\\')[0:-1])
'T:\\Data\\DBDesign'

虽然我建议使用os.path.dirname函数来完成这个任务,你只需要传递字符串,它就会为你完成工作。既然你似乎在使用Windows,考虑使用abspath函数。一个例子:

>>> import os
>>> os.path.dirname(os.path.abspath(existGDBPath))
'T:\\Data\\DBDesign'

如果您想在拆分后同时获取文件名和目录路径,可以使用返回元组的os.path.split函数,如下所示。
>>> import os
>>> os.path.split(os.path.abspath(existGDBPath))
('T:\\Data\\DBDesign', 'DBDesign_93_v141b.mdb')

1
os.sep.join(existGDBPath.split(os.sep)[:-1] 看起来更美观。 - Dave Babbitt
8
'\\'.join() 不具有可移植性,应使用 os.path.join() 替代。 - Sébastien Dawans
1
使用str方法的splitjoin不具备可移植性(考虑在*nix上的/)。os.path提供了您所需的所有方法。 - Petr Vepřek

130

使用PATHLIB模块(更新答案)

对于新开发,应考虑使用pathlib。它在Python3.4的stdlib中,但可用于PyPI早期版本。该库提供了一种更面向对象的方法来操作路径<opinion>,并且更易于阅读和编程</opinion>

>>> import pathlib
>>> existGDBPath = pathlib.Path(r'T:\Data\DBDesign\DBDesign_93_v141b.mdb')
>>> wkspFldr = existGDBPath.parent
>>> print wkspFldr
Path('T:\Data\DBDesign')

使用OS模块

使用os.path模块:

>>> import os
>>> existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
>>> wkspFldr = os.path.dirname(existGDBPath)
>>> print wkspFldr 
'T:\Data\DBDesign'

如果你需要进行文件名操作,可以假设这已经在os.path中实现了。如果没有,你仍然可能需要使用这个模块作为构建块。


1
Path().parent 就是我要找的! - iedmrc
标记只是因为你把<opinion />放在标签中了! - Vexen Crabtree

74
内置子模块os.path有一个用于此任务的函数。
import os
os.path.dirname('T:\Data\DBDesign\DBDesign_93_v141b.mdb')

5
这里是代码:
import os
existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = os.path.dirname(existGDBPath)
print wkspFldr # T:\Data\DBDesign

2

这是我用于将路径拆分为文件、路径标记的小实用程序助手:

最初的回答:

import os    
# usage: file, path = splitPath(s)
def splitPath(s):
    f = os.path.basename(s)
    p = s[:-(len(f))-1]
    return f, p

0

我使用这个来将当前工作目录更改为一个文件夹;

from os import chdir
from os.path import realpath
from os.path import dirname

chdir(realpath(dirname(argv[0])))
  • chdir 改变工作目录。我怀疑你不会需要这个。
  • realpath 跟随符号链接。
  • dirname 只返回路径
  • argv 是用来执行程序的命令行参数

0
任何想在ESRI GIS表格字段计算器界面中实现此操作的人都可以使用Python解析器来完成:

PathToContainingFolder =

"\\".join(!FullFilePathWithFileName!.split("\\")[0:-1])

这样

\Users\me\Desktop\New folder\file.txt

就会变成

\Users\me\Desktop\New folder


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接