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

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

我想把这个字符串分成:

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

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

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

最好的方法是什么?

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


当前回答

就像其他人解释的那样-你的问题源于使用\,这是字符串字面量/常量中的转义字符。OTOH,如果你有文件路径字符串从其他来源(从文件读取,控制台或由操作系统函数返回)-不会有问题分裂'\\'或r'\'。

就像其他人建议的那样,如果你想在程序文字中使用\,你必须复制它\\或者整个文字必须以r为前缀,比如r'lite\ral'或r"lite\ral",以避免解析器将\和r转换为CR(回车)字符。

还有一种方法——不要在代码中使用反斜杠\ pathnames !自上个世纪以来,Windows可以很好地识别使用正斜杠作为目录分隔符的路径名/!不知何故,没有多少人知道…但它是有效的:

>>> var = "d:/stuff/morestuff/furtherdown/THEFILE.txt"
>>> var.split('/')
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

顺便说一下,这将使您的代码在Unix, Windows和Mac上工作…因为它们都使用/作为目录分隔符…即使你不想使用模块os的预定义常量。

其他回答

使用ntpath.split ()

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

非常简单的方法:

var.replace ('\\', '/'). split(“/”)

让我们假设你有一个文件filedata.txt的内容:

d:\stuff\morestuff\furtherdown\THEFILE.txt
d:\otherstuff\something\otherfile.txt

您可以读取和分割文件路径:

>>> for i in open("filedata.txt").readlines():
...     print i.strip().split("\\")
... 
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
['d:', 'otherstuff', 'something', 'otherfile.txt']

调整了@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()实际上只需要一次,并且可以在递归的单独入口函数中完成。