我正在研究配置文件的解析器,并想知道是否有一种python本地方式来处理可能为任何操作系统创建的字符串的路径名。
示例:
pathName1 = r".../This/is/a/relative/path"
pathName2 = r"...\This\is\a\relative\path"
将被解释为相等,并且可用于访问正在执行代码的操作系统上的文件。
现在我有一个正则表达式hack用os.path.sep替换有问题的分隔符,但我认为这必须是一个常见的问题,可能有一个python本地方式这样做。
答案 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 \路径。