Python原生解析具有未知路径分隔符的路径名

时间:2013-12-20 21:38:55

标签: python filepath

我正在研究配置文件的解析器,并想知道是否有一种python本地方式来处理可能为任何操作系统创建的字符串的路径名。

示例:

pathName1 = r".../This/is/a/relative/path"
pathName2 = r"...\This\is\a\relative\path"

将被解释为相等,并且可用于访问正在执行代码的操作系统上的文件。

现在我有一个正则表达式hack用os.path.sep替换有问题的分隔符,但我认为这必须是一个常见的问题,可能有一个python本地方式这样做。

3 个答案:

答案 0 :(得分:2)

@Andrew Sledge在使用os.path.join生成路径方面是正确的,但是如果你遇到一个可能是样式的字符串而你想要将其规范化,那么这是一种方法:

import re
import os
def normalize_path(path):
    return os.path.normpath(os.sep.join(re.split(r'\\|/', path)))

用法:

>>> normalize_path("/usr/local/share/myfile")
'/usr/local/share/myfile'
>>> normalize_path("C:\My Documents\Users/music.mp3")
'C:/My Documents/Users/music.mp3'
>>> normalize_path("~/Documents///report.pdf")
'~/Documents/report.pdf'
>>> normalize_path("/tmp/subdir/subsubdir/.././//")
'/tmp/subdir'
>>> normalize_path("../Photos/.")
'../Photos'

用法,您只需使用普通的os.path内容:

>>> os.path.abspath(normalize_path("../Photos/."))
'/private/tmp/Photos'
>>> os.path.expanduser(normalize_path("~/Documents///report.pdf"))
'/Users/matt/Documents/report.pdf'
>>> os.path.join(normalize_path("/tmp//./subdir"), "myfile.txt")
'/tmp/subdir/myfile.txt'
>>> os.path.dirname(normalize_path("~/Documents///report.pdf"))
'~/Documents'
>>> os.path.basename(normalize_path("~/Documents///report.pdf"))
'report.pdf'

答案 1 :(得分:1)

Python能够使用os方法(os.chdir()os.path.*)透明地处理这两种类型,即使平台之间可能发生一些有趣的事情;但我认为配置文件可以是平台,甚至是计算机相关的。

顺便说一句,注意\:在Python代码中,要么需要转义它们("\\some\\path")要么使用原始字符串(`r“\ some path”),即使在文本文件中,它可以正常写入。


修改

如果使用相对路径,最好选择基于os.path.join使用“动态”的东西。例如:

test_files_path = os.path.join('..', '..', 'tests', 'resources')  
# ^ would result in something platform-dependent
my_test_file_one = os.path.join(test_files_path, 'test1.txt')

更精细:导入的模块具有__file__属性,因此您可以将其用于测试。例如:

import my_module
test_files_path = os.path.join( os.path.dirname(my_module.__file__), 'tests')
my_test_file_one = os.path.join(test_files_path, 'test1.txt')

答案 2 :(得分:0)

有几种方法可以做到这一点。最常见的方式是使用os.path.join

path = os.path.join("This", "is", "a", "relative", "path")

将为POSIX返回此/是/ a /路径,此\是Windows的\ a \路径。