Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从没有文件名的完整文件路径提取目录路径_Python_Python 3.x_File - Fatal编程技术网

Python 从没有文件名的完整文件路径提取目录路径

Python 从没有文件名的完整文件路径提取目录路径,python,python-3.x,file,Python,Python 3.x,File,我有一个函数,它以字符串形式接收完整的文件路径,目标是只返回文件路径而不返回文件名。目标还包括处理所有文件类型,如Windows、Unix等。我必须将\替换为/,这对于Windows文件路径很好,但对于Unix路径似乎没有必要 def get_path(file): file = file.replace('\\', '/') path = os.path.dirname(file) return path 有没有办法在不替换反斜杠的情况下提取路径? 下面是两个输入路径

我有一个函数,它以字符串形式接收完整的文件路径,目标是只返回文件路径而不返回文件名。目标还包括处理所有文件类型,如Windows、Unix等。我必须将
\
替换为
/
,这对于Windows文件路径很好,但对于Unix路径似乎没有必要

def get_path(file):
    file = file.replace('\\', '/')
    path = os.path.dirname(file)
    return path
有没有办法在不替换反斜杠的情况下提取路径? 下面是两个输入路径字符串示例

Windows:
'c:\\Program Files\\user\\file1.txt'
Unix:
'file/path/name.txt'


我已经搜索了整个堆栈,但找不到任何适合我的答案。

您可以使用
os.path.split()
。根据,它根据运行python的操作系统来分割路径

注意:由于不同的操作系统具有不同的路径名约定,因此标准库中有多个版本的此模块。path模块始终是适合Python运行的操作系统的路径模块,因此可用于本地路径。但是,如果要操纵始终采用不同格式之一的路径,也可以导入和使用各个模块。它们都有相同的接口: UNIX样式路径的posixpath

  • Windows路径的ntpath
  • 旧式MacOS路径的macpath
  • OS/2 EMX路径的OS2EMX路径
如果您有windows path,并且运行在Ubuntu/Linux上,那么您可以使用
ntpath
,就像文档中所说的那样:

>>> import ntpath

>>> ntpath.split("c:\\Program Files\\user\\file1.txt")
('c:\\Program Files\\user', 'file1.txt')

>>> ntpath.split("file/path/name.txt")
('file/path', 'name.txt')

os.path.split
为获取目录名提供了比
os.path.dirname
更大的好处吗?正如OP所说,“目标是只返回文件路径而不返回文件名。”是的,您可以毫无问题地这样做。顺便说一下,
os.path.dirname
在此特定路径失败,因为代码未在windows上运行。
os
模块检测到操作系统不是windows。因此,根据
os
模块,这不是一个有效的路径。@saz它不适用于所有unix路径。例如,
/home/user/c:\\foo\bar\baz
在unix中有效,但
ntpath.dirname
将返回
/home/user/c:\\\\foo\\bar
,而不是
/home/user