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

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

我想把这个字符串分成:

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

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

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

最好的方法是什么?

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


当前回答

你可以简单地使用最python化的方法(IMHO):

import os

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

这将给你:

['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

这里的线索是使用操作系统。Sep而不是“\\”或“/”,因为这使得它与系统无关。

要从驱动器号中删除冒号(尽管我看不出你为什么要这样做),你可以这样写:

path_list[0] = path_list[0][0]

其他回答

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

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

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

递归是为了好玩。

这不是最优雅的回答,但应该适用于任何地方:

import os

def split_path(path):
    head = os.path.dirname(path)
    tail = os.path.basename(path)
    if head == os.path.dirname(head):
        return [tail]
    return split_path(head) + [tail]

下面的代码行可以处理:

C:/路径/路径 C://path//path C:\路径\路径 C:\路径\路径

Path = re.split(r'[///\]', Path)

调整了@Mike Robins在开始时避免空路径元素的解决方案:

def parts(path):
    p,f = os.path.split(os.path.normpath(path))
    return parts(p) + [f] if f and p else [p] if p else []

Os.path.normpath()实际上只需要一次,并且可以在递归的单独入口函数中完成。

对于更简洁的解决方案,请考虑以下内容:

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