我有一个表示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必须安全地用作字符串函数拆分中的分隔符.
小智 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)
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.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')
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)
然后,一旦你拆分其中任何一个,你就会得到你想要的结果.
有关更简洁的解决方案,请考虑以下事项:
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)
我实际上无法为这个问题提供一个真正的答案(因为我来这里是希望自己找到一个),但对我来说,不同方法的数量和提到的所有警告是 Python 的 os.path 模块迫切需要这个的最确定的指标作为内置函数。