如何在Python中将DOS路径分割成组件

257 投票
23 回答
325601 浏览
提问于 2025-04-16 00:44

我有一个字符串变量,它表示一个DOS路径,比如:

var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

我想把这个字符串拆分成:

[ "d", "stuff", "morestuff", "furtherdown", "THEFILE.txt" ]

我试过用 split()replace(),但是它们要么只处理第一个反斜杠,要么在字符串里插入十六进制数字。

我需要以某种方式把这个字符串变量转换成原始字符串,这样我才能解析它。

有什么好的方法可以做到这一点吗?

我还应该补充一下,var 的内容,也就是我想解析的路径,实际上是一个命令行查询的返回值。这不是我自己生成的路径数据。它存储在一个文件里,而命令行工具不会对反斜杠进行转义。

23 个回答

143

在Python 3.4及以上版本中,这变得简单多了。你现在可以使用 pathlib.Path.parts 来获取路径的所有部分。

举个例子:

>>> from pathlib import Path
>>> Path('C:/path/to/file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> Path(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')

在Windows系统上安装的Python 3会默认你在使用Windows的路径,而在*unix系统上则会默认你在使用posix路径。这通常是你想要的效果,但如果不是的话,你可以根据需要使用 pathlib.PurePosixPathpathlib.PureWindowsPath 这些类:

>>> from pathlib import PurePosixPath, PureWindowsPath
>>> PurePosixPath('/path/to/file.txt').parts
('/', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'\\host\share\path\to\file.txt').parts
('\\\\host\\share\\', 'path', 'to', 'file.txt')

补充说明:还有一个可以在Python 2上使用的版本,叫做 pathlib2

462

我会这样做:

import os
path = os.path.normpath(path)
path.split(os.sep)

首先,把路径字符串转换成适合操作系统的格式。然后,os.sep可以安全地用作字符串分割的分隔符。

227

我遇到过很多人自己写路径处理函数,结果搞错了。空格、斜杠、反斜杠、冒号——这些都容易让人混淆,虽然混淆的可能性不是无穷无尽,但出错的机会却很大。所以我特别强调使用 os.path,并且基于这个原因推荐它。

(不过,走向正确的道路并不是最简单的选择,很多人在发现这个时,可能会忍不住走上一条滑坡之路,最终导致麻烦。他们可能直到某一天一切都崩溃了,才意识到问题出在哪里,结果发现某个人搞了个文件名,里面混用了斜杠和反斜杠——然后有人会建议说“别这么做”。希望你不要成为这些人,除了那个搞混斜杠和反斜杠的人——如果你愿意,你可以成为他们。)

你可以这样获取驱动器和路径加文件:

drive, path_and_file = os.path.splitdrive(path)

获取路径和文件:

path, file = os.path.split(path_and_file)

单独获取文件夹名称并不是特别方便,但这是一种诚实的中等不适感,能让你在之后找到真正好用的东西时更加开心:

folders = []
while 1:
    path, folder = os.path.split(path)

    if folder != "":
        folders.append(folder)
    else:
        if path != "":
            folders.append(path)

        break

folders.reverse()

(如果路径最开始是绝对路径,这会在 folders 的开头加一个 "\"。如果你不想要这个,可能会丢失一些代码。)

撰写回答