请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需要一步,快速开始

搜索
开启左侧

Python小技巧:3个处理文件路径的简单方法

马上注册,分享更多源码,享用更多功能,让你轻松玩转云大陆。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
123019skqi1ac1qpd6k3dc.jpg

原标题 | Python 3 Quick Tip: The easy way to deal with file paths on Windows, Mac and Linux
作者 | Adam Geitgey
译者 | 林肯二百一十三(西安交通大学)、Dooria
几乎所有计算机在文件夹名称间使用的都是正斜杠,但微软Windows使用的是却反斜杠, 这不免造成了编程的一个小烦恼。
123020gfsc5fh81hjst5hz.jpg

这是1980年代早期,计算机史上的一个意外。MS-DOS的第一个版本使用正斜杠来指定命令行选项。当微软在MS-DOS2.0中增加对文件夹的支持时,因为正斜杠已经被使用了,所以使用反斜杠代替。三十五年后,这种不兼容依旧困扰着我们。
如果希望你的Python代码能够同时在Windows和Mac/Linux上运行,你需要解决这类平台的特定问题。幸运的是,Python3的新模块pathlib可以使文件操作变得更简单。
以下是一些使用pathlib处理文件名的方法,它可以使命名操作变得简单得多。

错误的方法:手工构建文件路径

假设现在你有一个数据包,其中包含了你的Python项目里需要的文件。
123020zdl6lmyxqdnnyfgg.jpg

下面是错误的代码:
123020clnz4tip4p4lppng.jpg

请注意,因为是在Mac平台上,我使用了Unix风格的正斜杠硬编码路径。这会让Windows用户非常头疼。
从技术上讲,这个代码在Windows上也能运行,因为Python会在调用open函数时识别出任何一种斜杠。即便如此,你也不应该依赖它。不是所有的python库都可以在错误的操作系统上使用错误的斜杠,特别是当它们有外部程序或库接口时。
并且,Python对混合斜杠类型的支持仅限Windows,它无法反向工作。也就是说,代码中的反斜杠将在Mac上完全失效。
123020acljb9zqcdzi69gf.jpg

出于上述原因以及其他更多的原因,使用硬编码的路径字符串编写代码会被其他程序员diss的,应该尽量避免。

老方法:Python的os.path模块

Python的os.path模块提供了很多有用的工具以帮助我们处理这些面向特定操作系统的文件系统问题。
你可以用os.path.join函数来针对当前操作系统正确地使用斜杠来构建路径:
123020qfuonxhn3brf7ipn.jpg

上面的代码在Windows和Mac都能有效工作——但问题就是用起来很让人头大。每次调用os.path.join把路径中的每一部分作为一个独立的字符串参数传进去的办法实在太麻烦了。
因为os.path模块的大部分函数都像os.path.join这样笨拙,Python开发者们经常就懒得用这些工具,结果写了一堆跨平台bug,还惹恼了一群用户。

新方法:Python 3 的 pathlib!

Python 3.4 引入了一个用于处理文件和路径的新标准库——pathlib,而且很好用!
要用pathlib,只要新建一个Path对象并传入使用正斜杠的路径或文件名,剩下的pathlib都帮你搞定:
123020za3qazrf007tk042.jpg

请注意两点:

  • 在pathlib中请直接用正斜杠(“/”)。Path对象可以将正斜杠转换成当前操作系统应该使用的正确斜杠。Nice!
  • 如果想在某个Path对象后添加内容,只要在代码里使用“/”操作符(也就是除号!?)。跟一遍又一遍地敲os.path.join(a, b)的日子说拜拜吧!
如果这就是pathlib做的事情,那它可真是Python的一个不错的补充——但它做的其实更多呢~
比如,我们可以不用调用open或者close之类的函数,而直接读文件的内容:
123020szwhwodi3inolpxp.jpg

注:上上部分的例子是有bug的,因为读取的文件没有关闭。但这里的语句则完全避免了这个问题!
pathlib还把最标准的文件操作变得简单易用:
123021bps6m866jyss8bk6.jpg

你甚至可以用pathlib来将一个Unix系统的路径转换成Windows格式的路径:
123021t4r5xx4xmwxb15xd.jpg

如果你非得用反斜杠还想不出问题呢?好吧…你可以把你的路径公告成Windows格式的,这样pathlib在其他操作系统中依然能把它转换成合适的形式:
123021ajkjca5vkf5as0jy.jpg

如果你还想再6一点?你甚至可以用pathlib来解析文件的相关路径,解析网络共享路径或者生成"file://"格式的URL。下边的例子用四行代码(其中两行还是import)做到了用你的Web浏览器打开一个本地文件:
123021t3r3y31tz3jx1bhh.jpg

而这也不过是pathlib的一个小功能而已。pathlib足以替代散落在Python各种模块中的文件相关功能。看看文档,试一下吧~
本文编辑:Pita
英语原文:https://medium.com/@ageitgey/python-3-quick-tip-the-easy-way-to-deal-with-file-paths-on-windows-mac-and-linux-11a072b58d5f
想要继续查看该篇文章相关链接和参考文献?
点击【Python小技巧:3个处理文件路径的简单方法】就可访问:
福利大放送——满满的干货课程免费送!
「好玩的Python:从数据挖掘到深度学习」该课程涵盖了从Python入门到CV、NLP实践等内容,是非常不错的深度学习入门课程,共计9节32课时,总长度约为13个小时。。
课程页面:https://ai.yanxishe.com/page/domesticCourse/37
「计算机视觉基础入门课程」本课程主要详情深度学习在计算机视觉方向的算法与应用,涵盖了计算机视觉的历史与整个课程规划、CNN的模型原理与训练技巧、计算机视觉的应用案例等,适合对计算机视觉感兴趣的新人。
课程页面:https://ai.yanxishe.com/page/domesticCourse/46
现AI研习社将两门课程免费开放给社区认证用户,只要您在认证时在备注框里填写「Python」,待认证通过后,就可获得该课程全部解锁权限。心动不如行动噢~
认证方式:https://ai.yanxishe.com/page/blogDetail/13999
雷锋网雷锋网雷锋网
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

  • 0 关注
  • 0 粉丝
  • 6 帖子
广告招商