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

var = “d:\stuff\morestuff\Furtherdown\THEFILE.txt”

我想把这个字符串分成:

[ “d”, “stuff”, “morestuff”, “Furtherdown”, “THEFILE.txt” ]

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

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

最好的方法是什么?

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


当前回答

对于这个问题,我实际上无法给出一个真正的答案(因为我来这里是希望自己找到一个答案),但对我来说,不同方法的数量和所有提到的注意事项都是Python操作系统最可靠的指标。Path模块非常需要这个内置函数。

其他回答

在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')

在Python 3的Windows安装上,这将假设您使用的是Windows路径,而在*nix上,它将假设您使用的是posix路径。这通常是你想要的,但如果不是,你可以使用类pathlib。PurePosixPath或pathlib。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

这里的问题首先要从如何创建字符串开始。

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

通过这种方式,Python试图对这些对象进行特殊处理:\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

一旦你把它们分开,你就会得到你想要的结果。

对于这个问题,我实际上无法给出一个真正的答案(因为我来这里是希望自己找到一个答案),但对我来说,不同方法的数量和所有提到的注意事项都是Python操作系统最可靠的指标。Path模块非常需要这个内置函数。

关于关于mypath.split("\\")的内容最好表示为mypath.split(os.sep)。sep是你的特定平台的路径分隔符(例如,\ for Windows, / for Unix,等等),Python构建知道使用哪个。如果您使用sep,那么您的代码将是平台不可知的。

from os import path as os_path

然后

def split_path_iter(string, lst):
    head, tail = os_path.split(string)
    if head == '':
        return [string] + lst
    else:
        return split_path_iter(head, [tail] + lst)

def split_path(string):
    return split_path_iter(string, [])

或者,受以上答案启发(更优雅):

def split_path(string):
    head, tail = os_path.split(string)
    if head == '':
        return [string]
    else:
        return split_path(head) + [tail]