用Python统一跨平台文件路径

Last Updated: 2024-05-09 13:36:34 Thursday

-- TOC --

Python是跨平台的,主流平台都有发布版本。但是这并不能保证我们写的Python代码也一定具有跨平台的能力,比如在处理文件路径时。

文件路径在Linux和Windows下的差异

这几乎是众所周知的差异,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.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来拼接,可以得到跨平台的好处。

用pathlib.Path对象

这是我认为在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 --