Last Updated: 2024-05-09 13:36:34 Thursday
-- TOC --
Python是跨平台的,主流平台都有发布版本。但是这并不能保证我们写的Python代码也一定具有跨平台的能力,比如在处理文件路径时。
这几乎是众所周知的差异,Linux下文件路径使用 /
符号(forward slash),绝对路径就以此符号开头,而Windows下文件路径使用 \\
或 \
符号,绝对路径还要带上一个盘符。
# Linux
/home/xinlin/repos/mdsite
# Windows
E:\\home\\xinlin\\repos\\mdsite
如果你的Python代码要处理的文件都在当前目录下,这个问题是可以规避的,代码中直接用文件名即可,没有路径符号。但是更多的场景是,文件分布在各个不同的路径下面,情况比较复杂,要通过字符串的拼接来得到文件路径。比如下面的代码:
pathname = 'path' + '/to' + '/filename'
with open(pathname, 'rb') as f:
...
这个代码在Linux下没问题,但是在Windows下,path/to/filename
就不是一个合法的路径,程序会因此崩溃。(Windows下合法的路径写法为:path\\to\\filename
)
难道要在代码中区分运行平台吗?
import os
if os.name == 'nt':
pathname = '\\'.join(('path', 'to', 'filename'))
elif os.name == 'posix':
pathname = 'path' + '/to' + '/filename'
with open(pathname, 'rb') as f:
...
这看上去显然不是个特别好的方法,下面介绍两个更好的方法来处理这样的问题。
os.path.join
函数接口可以自动按照底层OS的类型来拼接文件路径。
Windows平台是这样的效果:
>>> import os
>>> os.name
'nt'
>>> os.path.join('path','to','filename')
'path\\to\\filename'
Linux平台是这样的效果:
>>> import os
>>> os.name
'posix'
>>> os.path.join('path','to','filename')
'path/to/filename'
所以,不要再直接字符串拼接文件路径了,使用os.path.join来拼接,可以得到跨平台的好处。
这是我认为在Python中,最优雅地解决跨系统处理文件路径问题的方法。
Windows平台使用pathlib.Path对象的效果:
>>> from pathlib import Path
>>>
>>> pathname = Path() / 'path' / 'to' / 'filename'
>>> pathname
WindowsPath('path/to/filename')
>>> print(pathname)
path\to\filename
Path对象具有 /
操作符,用这个操作符直接拼接文件路径,在具体使用这个路径的时候,WindowPath对象会按照Windows平台的规则,转换路径格式。
注意:str对象直接没有
/
操作符;代码的计算是从左到右!
Linux平台使用pathlib.Path对象的效果:
>>> from pathlib import Path
>>>
>>> pathname = Path() / 'path' / 'to' / 'filename'
>>> pathname
PosixPath('path/to/filename')
>>> print(pathname)
path/to/filename
最后,建议使用pathlib.Path来编写支持跨平台文件路径的Python代码,简洁优雅!
本文链接:https://cs.pynote.net/sf/python/202109192/
-- EOF --
-- MORE --