专栏首页AI研习社Python小技巧:3个处理文件路径的简单方法

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

原标题 | Python 3 Quick Tip: The easy way to deal with file paths on Windows, Mac and Linux 作者 | Adam Geitgey 译者 | 林肯二百一十三(西安交通大学)、Dooria 注:本文的相关链接请访问文末【阅读原文】

几乎所有计算机在文件夹名称间使用的都是正斜杠,但微软Windows使用的是却反斜杠, 这不免造成了编程的一个小烦恼。

Windows filenames:
C:\some_folder\some_file.txt

Most other operationg systems:
/some_folder/some_file.txt

这是1980年代早期,计算机史上的一个意外。MS-DOS的第一个版本使用正斜杠来指定命令行选项。当微软在MS-DOS2.0中增加对文件夹的支持时,因为正斜杠已经被使用了,所以使用反斜杠代替。三十五年后,这种不兼容仍旧困扰着我们。

如果希望你的Python代码能够同时在Windows和Mac/Linux上运行,你需要解决这类平台的特定问题。幸运的是,Python3的新模块pathlib可以使文件操作变得更简单。

以下是一些使用pathlib处理文件名的方法,它可以使命名操作变得简单得多。

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

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

下面是错误的代码:

请注意,因为是在Mac平台上,我使用了Unix风格的正斜杠硬编码路径。这会让Windows用户非常头疼。

从技术上讲,这个代码在Windows上也能运行,因为Python会在调用open()函数时识别出任何一种斜杠。即便如此,你也不应该依赖它。不是所有的python库都可以在错误的操作系统上使用错误的斜杠,特别是当它们有外部程序或库接口时。

并且,Python对混合斜杠类型的支持仅限Windows,它无法反向工作。也就是说,代码中的反斜杠将在Mac上完全失效。

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

老方法:Python的os.path模块

Python的os.path模块提供了很多有用的工具以帮助我们处理这些面向特定操作系统的文件系统问题。

你可以用os.path.join()函数来针对当前操作系统正确地使用斜杠来构建路径:

上面的代码在Windows和Mac都能有效工作——但问题就是用起来很让人头大。每次调用os.path.join()把路径中的每一部分作为一个独立的字符串参数传进去的办法实在太麻烦了。

因为os.path模块的大部分函数都像os.path.join()这样笨拙,Python开发者们经常就懒得用这些工具,结果写了一堆跨平台bug,还惹恼了一群用户。

新方法:Python 3 的 pathlib!

Python 3.4 引入了一个用于处理文件和路径的新标准库——pathlib,而且很好用!

要用pathlib,只要新建一个Path()对象并传入使用正斜杠的路径或文件名,剩下的pathlib都帮你搞定:

请注意两点:

  • 在pathlib中请直接用正斜杠(“/”)。Path对象可以将正斜杠转换成当前操作系统应该使用的正确斜杠。Nice!
  • 如果想在某个Path对象后添加内容,只要在代码里使用“/”操作符(也就是除号!?)。跟一遍又一遍地敲os.path.join(a, b)的日子说拜拜吧!

如果这就是pathlib做的事情,那它可真是Python的一个不错的补充——但它做的其实更多呢~

比如,我们可以不用调用open()或者close()之类的函数,而直接读文件的内容:

注:上上部分的例子是有bug的,因为读取的文件没有关闭。但这里的语句则完全避免了这个问题!

pathlib还把最标准的文件操作变得简单易用:

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

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

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

而这也不过是pathlib的一个小功能而已。pathlib足以替代散落在Python各种模块中的文件相关功能。看看文档,试一下吧~

感谢您的阅读!如果您对机器学习感兴趣(或者只是想理解它究竟是个什么),请查看我的有趣的机器学习系列,或在Twitter关注我@ageitgey以及在LinkedIn找到我。


本文编辑:Pita

英语原文:https://medium.com/@ageitgey/python-3-quick-tip-the-easy-way-to-deal-with-file-paths-on-windows-mac-and-linux-11a072b58d5f

想要继续查看该篇文章相关链接和参考文献?

点击底部【阅读原文】即可访问:

https://ai.yanxishe.com/page/TextTranslation/1883

本文分享自微信公众号 - AI研习社(okweiwu),作者:雷锋字幕组

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 谷歌开源基于 ML 的手部跟踪算法:手机端实时检测,多个手势同时捕捉

    就在不久前,Google 人工智能实验室宣布,他们在「实时手部跟踪」方面取得了新的进展,并将这项新技术运用在了 MediaPipe 中,这也是 AI 计算机视觉...

    AI研习社
  • 教程 | Geoffrey Hinton 机器学习第四课(中文字幕)

    作为深度学习祖师,Geoffrey Hinton 的每一句每一言,都使学习者如奉纶音。浓缩其毕生所学的《Neutral Network for Machine ...

    AI研习社
  • 如何理解Nvidia英伟达的Multi-GPU多卡通信框架NCCL?

    深度学习中常常需要多GPU并行训练,而Nvidia的NCCL库NVIDIA/nccl(https://github.com/NVIDIA/nccl)在各大深度学...

    AI研习社
  • CVE-2019-10392:Jenkins Git client插件RCE复现

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

    7089bAt@PowerLi
  • CVE-2019-10392:Jenkins Git client插件RCE复现

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

    用户1631416
  • WeTest腾讯质量开放平台内测开启

    WeTest腾讯质量开放平台(wetest.qq.com)于2015年1月22日开启内测。

    WeTest质量开放平台团队
  • 浅谈AndroidGPU过度绘制、GPU呈现模式分析及相关优化

    在真机设备下有一个开发者选项,这个大家都知道,我们最常用的就打开'USB调试'功能,方便真机调试。

    听着music睡
  • Puppet,Ansible,Saltstack 有哪些区别和联系

    目前主流的自动化运维工具有puppet、ansible、saltstack,实际上每一个工具都基本上能够完成你的运维任务,也都是久经考验的。都有NB的地方,也有...

    小小科
  • 数据生命周期管理的初步设计

    之前做了一个初版的生命周期设计,导致对于实现的难度低估,在实际设计的时候,碰到了一些意料之外的边界问题。

    jeanron100
  • Python花式编程案例集锦(8):判断吉祥数字

    问题描述:在有些文化中,认为含有8的数字是吉祥数字,能给自己带来好运。要求编写一个函数测试给定的数字是否为吉祥数字。 参考代码: ? 代码运行没有输出,说明两种...

    Python小屋屋主

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动