Python:os.path.join()产生的斜杠在Windows和Linux下的不同表现和解决方法
时间:2022-07-23
本文章向大家介绍Python:os.path.join()产生的斜杠在Windows和Linux下的不同表现和解决方法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原文链接 https://www.polarxiong.com/archives/Python-os-path-join-%E4%BA%A7%E7%94%9F%E7%9A%84%E6%96%9C%E6%9D%A0%E5%9C%A8Windows%E5%92%8CLinux%E4%B8%8B%E7%9A%84%E4%B8%8D%E5%90%8C%E8%A1%A8%E7%8E%B0%E5%92%8C%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95.html#comments
问题描述
- 我一直以为Python是隔离了操作系统的差异,同样的function在不同操作系统下会有一致的结果,直到前几天临时切换到Windows下发现有些Python代码跑不出来,才发现如os.path.join()这样的方法在不同操作系统下的表现是不一致的。
- 例如
import os.path
print(os.path.join('a', 'b', 'c'))
在Linux/macOS下会显示 a/b/c 而在Windows下会显示 abc
- 即 os.path.join()在Linux/macOS下会以斜杠(/)分隔路径,而在Windows下则会以反斜杠()分隔路径。
原因分析
- 这种内置标准库方法的不一致从哪来的?官方文档实际上早就有明显的暗示了。
- 在os.path的官方文档页面11.2. os.path — Common pathname manipulations — Python 3.7.0 documentation开始位置就提到源代码文件根据不同操作系统在三个不同文件中:
- Source code: Lib/posixpath.py (for POSIX), Lib/ntpath.py (for Windows NT), and Lib/macpath.py (for Macintosh)
- 可见在安装Python时就会根据不同操作系统,仅使用对应操作系统类别的os.path模块。如果顺着源码去看,就会发现os.path.join()在Linux下是以斜杠(/)作为分隔符的,而在Windows下则是以反斜杠()作为分隔符的。
Mac的一些细节
- 如果跟着看Macintosh操作系统对应的源码Lib/macpath.py的话,会很惊讶地发现Macintosh下不是以斜杠(/)也不是以反斜杠(),而是以冒号(:)作为分隔符的,是不是很震惊:我的mac怎么可能是以冒号(:)为分隔符的?!
- 这其实是一个历史问题了,这里Lib/macpath.py仅应用到了2001发布的Mac OS X之前的Macintosh操作系统中,那时的Macintosh确实是用冒号(:)为分隔符的。而从2001年的Mac OS X开始,到2012年的OS X,再到2016年的macOS,都采用了遵循Unix的斜杠(/)分隔符,也就直接使用Linux的源码Lib/posixpath.py了。
为什么Windows要使用反斜杠()
- 为什么Windows不使用斜杠(/),而独树一帜使用反斜杠()呢,专门为了为难程序员?
- 这其实也是个历史问题,归根到底还是因为Windows为了保持对DOS的兼容性,而DOS为什么要使用反斜杠()就说来话长了
解决方法
- 从上面的分析可以发现os.path.join()仅包含对应操作系统类型的实现,所以我们无法通过指定参数的形式生成诸如适用于Linux或Windows的路径,那么如何解决这一问题呢?这里以在Windows下生成Linux格式(斜杠(/)分隔符)路径为例来说明。
通过str.replace()
- 这是一种简单直接的方法,直接把Windows下os.path.join()生成的反斜杠()全部替换为斜杠(/),如:
import os.path
result = os.path.join('a', 'b', 'c')
print(result)
result = result.replace('\', '/')
print(result)
- 会得到
abc
a/b/c
通过pathlib.PurePath.as_posix()
- 从Python 3.4开始可以通过pathlib.PurePath.as_posix()来生成斜杠(/)格式的路径,其实其实现原理和str.replace()并没有太大区别。例如:
import os.path
from pathlib import Path
result = os.path.join('a', 'b', 'c')
print(result)
result = Path(result).as_posix()
print(result)
- 会得到
abc
a/b/c
- 通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用
- 自动驾驶车辆在2017年的七大光辉历史时刻
- 简单的实现Javascript的MVC
- 谷歌再出黑科技!人工智能模拟的人声和真人几乎难以分辨
- 【Scikit-Learn 中文文档】高斯混合模型 - 无监督学习 - 用户指南 | ApacheCN
- “E+单拼”组合域名eqi.com小六位结拍
- ASP.NET Core中的依赖注入(3): 服务的注册与提供
- 【Scikit-Learn 中文文档】使用 scikit-learn 介绍机器学习 | ApacheCN
- 哈萨比斯:2018年AI最大突破在生物或化学领域
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】
- ASP.NET MVC的View是如何被呈现出来的?[设计篇]
- Python大牛告诉你一行代码能干什么?神奇
- 谷歌最新人工智能研究:仅利用稀疏轮廓位置“重构”图像
- DATUM和BigchainDB
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SHELL命令分组统计
- 一行代码实现display"过渡动画"原理
- 3D星空图
- shading-jdbc 4.1.1 + tk.mybatis + pagehelper 1.3.x +spring boot 2.x 使用注意事项
- 用辗转相除法求两个正整数的最大公约数
- Js根据数组相同的值生成二维数组
- 顺序消息管道《Message Pipe》v1.0.2版本发布
- Ts安装及自动编译ts文件
- python 自动化测试(1):获取验证码图片,实现自动登录
- RocketMQ学习第一步之源码构建
- python 库学习之:openpyxl
- python 学习之:读取xml配置文件
- 我的C语言入门笔记~!
- 宜信OCR技术探索之版面分析业务实践|技术沙龙直播速记
- python 学习之:将字符串转换成变量,调用该变量实例对象的方法