如何在Python中将dos路径拆分为其组件

Bee*_*and 131 python

我有一个表示dos路径的字符串变量,例如:

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

我想将此字符串拆分为:

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

我已经尝试使用split()replace(),但他们要么只处理第一个反斜杠或者插入十六进制数字串入.

我需要以某种方式将此字符串变量转换为原始字符串,以便我可以解析它.

最好的方法是什么?

我还应该补充一点,var即我试图解析的路径的内容实际上是命令行查询的返回值.这不是我自己生成的路径数据.它存储在一个文件中,命令行工具不会逃避反斜杠.

Tom*_*mpa 250

我会做

import os
path = os.path.normpath(path)
path.split(os.sep)
Run Code Online (Sandbox Code Playgroud)

首先将路径字符串规范化为适当的OS字符串.然后os.sep必须安全地用作字符串函数拆分中的分隔符.

  • 一个真正的答案:_it已经出现_.当然,规范解决方案是最简单的.**看哪!**因为它优雅而且有韵味,没有令人难以忍受的边缘情况. (23认同)
  • 作为一个单行,`os.path.normpath(a_path).split(os.path.sep)` (16认同)
  • 这似乎不适用于 path = root。在这种情况下,path.split 的结果是 ['','']。事实上,一般来说,这个 split() 解决方案给出了一个带有空字符串名称的最左边的目录(可以用适当的斜杠替换)。核心问题是单个斜杠(向前或向后取决于操作系统)是根目录的*名称*,而路径中的其他地方则是*分隔符*。 (3认同)
  • 那么使用 lstrip 会更好吗?`os.path.normpath(path).lstrip(os.path.sep).split(os.path.sep)` (2认同)

小智 152

我一直被人们编写自己的路径摆弄功能并弄错了.空格,斜线,反斜线,冒号 - 混淆的可能性并非无穷无尽,但无论如何都很容易犯错误.所以我是一个坚持使用的人os.path,并在此基础上推荐它.

(然而,走向美德的道路并不是最容易采取的道路,很多人在发现这一点时,很想直接走向诅咒.他们直到有一天一切都崩溃了,他们才会意识到 - 或者,更有可能的是,其他人 - 必须解决为什么一切都出错了,事实证明有人制作了混合斜杠和反斜杠的文件名 - 而且有人建议答案是"不要这样做".Don'这些人中的任何一个.除了混合斜杠和反斜杠的人之外 - 如果你愿意,你可以成为他们.)

您可以像这样获取驱动器和路径+文件:

drive, path_and_file = os.path.splitdrive(path)
Run Code Online (Sandbox Code Playgroud)

获取路径和文件:

path, file = os.path.split(path_and_file)
Run Code Online (Sandbox Code Playgroud)

获取单个文件夹名称并不是特别方便,但它是一种诚实的中等不适,增加了以后找到实际效果很好的东西的乐趣:

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

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

        break

folders.reverse()
Run Code Online (Sandbox Code Playgroud)

(如果路径最初是绝对路径"\",folders则会在开头弹出.如果您不想要,可能会丢失一些代码.)


Mac*_* D. 73

你可以简单地使用最Pythonic方法(恕我直言):

import os

your_path = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
path_list = your_path.split(os.sep)
print path_list
Run Code Online (Sandbox Code Playgroud)

哪个会给你:

['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
Run Code Online (Sandbox Code Playgroud)

这里的线索是使用os.sep替代'\\'或者'/',因为这会使系统无关.

要从驱动器号中删除冒号(虽然我没有看到你想要这样做的任何理由),你可以写:

path_list[0] = path_list[0][0]
Run Code Online (Sandbox Code Playgroud)

  • 这有点'有些'.其他时候(至少在Windows上)你会发现看起来像`folder\folder2\folder3/file.txt`的路径.最好先对路径进行规范化(os.path.normpath),然后将其拆分. (22认同)
  • **这个答案是_almost_那里.**正如[vikki](/sf/users/55330761/)所暗示的那样,在普通的边缘情况下,在字符串拆分之前未能规范化路径名(例如,` /富// bar`).请参阅[Tompa](/sf/users/147527551/)的[答案](/sf/users/147527551/)以获得更强大的解决方案. (7认同)

fre*_*hen 50

在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')
Run Code Online (Sandbox Code Playgroud)

在Windows 3的Windows安装上,这将假设您正在使用Windows路径,而在*nix上,它将假定您正在使用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')
Run Code Online (Sandbox Code Playgroud)

编辑:还有一个可用的python 2的后端:pathlib2


Cra*_*der 11

这里的问题始于你如何创建字符串.

a = "d:\stuff\morestuff\furtherdown\THEFILE.txt"
Run Code Online (Sandbox Code Playgroud)

使用这种方式时,巨蟒试图特殊情况下,这些:\s,\m,\f,和\T.在您的情况下,\f正在被视为换页(0x0C),而其他反斜杠被正确处理.你需要做的是这些之一:

b = "d:\\stuff\\morestuff\\furtherdown\\THEFILE.txt"      # doubled backslashes
c = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"         # raw string, no doubling necessary
Run Code Online (Sandbox Code Playgroud)

然后,一旦你拆分其中任何一个,你就会得到你想要的结果.


use*_*435 9

有关更简洁的解决方案,请考虑以下事项:

def split_path(p):
    a,b = os.path.split(p)
    return (split_path(a) if len(a) and len(b) else []) + [b]
Run Code Online (Sandbox Code Playgroud)

  • 如果路径以 `/` 结尾,这将不起作用。此外,如果您的路径以`/` 开头,则在列表的开头为您提供一个空字符串 (2认同)

ant*_*red 5

我实际上无法为这个问题提供一个真正的答案(因为我来这里是希望自己找到一个),但对我来说,不同方法的数量和提到的所有警告是 Python 的 os.path 模块迫切需要这个的最确定的指标作为内置函数。

  • [`pathlib.Path.parts`](https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.parts) 满足您的愿望 (2认同)