原标题 | 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 operating systems:

/some_folder/some_file.txt

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

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

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

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

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

下面是错误的代码:

data_folder = "source_data/text_files/"

file_to_open = data_folder + "raw_data.txt"

f = open(file_to_open)

print(f.read())

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

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

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

data_folder = "source_data\\text_files\\"

file_to_open = data_folder + "raw_data.txt"

f = open(file_to_open)

print(f.read())

# On a Mac, this code will throw an exception:

# FileNotFoundError: [Errno 2] No such file or directory: 'source_data\\text_files\\raw_data.txt'

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

老方法:Python的os.path模块

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

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

import os.path

data_folder = os.path.join("source_data", "text_files")

file_to_open = os.path.join(data_folder, "raw_data.txt")

f = open(file_to_open)

print(f.read())

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

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

新方法:Python 3 的 pathlib!

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

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

from pathlib import Path

data_folder = Path("source_data/text_files/")

file_to_open = data_folder / "raw_data.txt"

f = open(file_to_open)

print(f.read())

请注意两点:在pathlib中请直接用正斜杠(“/”)。Path对象可以将正斜杠转换成当前操作系统应该使用的正确斜杠。Nice!

如果想在某个Path对象后添加内容,只要在代码里使用“/”操作符(也就是除号!?)。跟一遍又一遍地敲os.path.join(a, b)的日子说拜拜吧!

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

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

from pathlib import Path

data_folder = Path("source_data/text_files/")

file_to_open = data_folder / "raw_data.txt"

print(file_to_open.read_text())

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

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

from pathlib import Path

filename = Path("source_data/text_files/raw_data.txt")

print(filename.name)

# prints "raw_data.txt"

print(filename.suffix)

# prints "txt"

print(filename.stem)

# prints "raw_data"

if not filename.exists():

print("Oops, file doesn't exist!")

else:

print("Yay, the file exists!")

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

from pathlib import Path, PureWindowsPath

filename = Path("source_data/text_files/raw_data.txt")

# Convert path to Windows format

path_on_windows = PureWindowsPath(filename)

print(path_on_windows)

# prints "source_data\text_files\raw_data.txt"

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

from pathlib import Path, PureWindowsPath

# I've explicitly declared my path as being in Windows format, so I can use forward slashes in it.

filename = PureWindowsPath("source_data\\text_files\\raw_data.txt")

# Convert path to the right format for the current operating system

correct_path = Path(filename)

print(correct_path)

# prints "source_data/text_files/raw_data.txt" on Mac and Linux

# prints "source_data\text_files\raw_data.txt" on Windows

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

from pathlib import Path

import webbrowser

filename = Path("source_data/text_files/raw_data.txt")

webbrowser.open(filename.absolute().as_uri())

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

本文编辑:Pita

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

福利大放送——满满的干货课程免费送!

「好玩的Python:从数据挖掘到深度学习」该课程涵盖了从Python入门到CV、NLP实践等内容,是非常不错的深度学习入门课程,共计9节32课时,总长度约为13个小时。。

「计算机视觉基础入门课程」本课程主要介绍深度学习在计算机视觉方向的算法与应用,涵盖了计算机视觉的历史与整个课程规划、CNN的模型原理与训练技巧、计算机视觉的应用案例等,适合对计算机视觉感兴趣的新人。

现AI研习社将两门课程免费开放给社区认证用户,只要您在认证时在备注框里填写「Python」,待认证通过后,即可获得该课程全部解锁权限。心动不如行动噢~

mac系统python读取文件路径_Python小技巧:3个处理文件路径的简单方法相关推荐

  1. mac系统python读取文件路径_python读取文件常见问题(Mac版)

    python读取数据文件以进行下一步分析我一般用pandas,代码很简单 import pandas as pd import numpy as np data_file = pd.read_csv( ...

  2. mac系统python读取文件路径_mac下python目录

    经常碰到安装成功但调用不成功,可能都是装错地方了,可以直接命令行python2.7或python2.6执行. 查看python位置: Chaim:texas2016 Chaim$ which pyth ...

  3. python查询文件软件_Python小工具--多文件查找字符串fs

    前几天,在看Android的makefile时,为方便自己在make文件查找字符串,用perl写了个小工具,实现的功能就是在目录下的多个文本文件中查找字符串.那个工具在同事的帮助下,已经实现了不少功能 ...

  4. python读取图片分辨率_python获取网页中所有图片并筛选指定分辨率的方法

    压测时,图片太少,想着下载网页中的图片,然后过滤指定分辨率,但网页中指定分辨率的图片太少了(见下) 后使用格式工厂转换图片 import urllib.request # 导入urllib模块 imp ...

  5. jenkins修改pom文件_jenkins使用小技巧:pom.xml文件里的版本随着每次发布变化怎么办?...

    针对这个问题,构建方法不变, 变化在动态去获取每次打出来的包名, 比如说,本次打出来的报名mypackage-1.0.3-SNAPSHOT.jar 那么,先进入target目录 #先进入target目 ...

  6. ai跟随路径_Illustrator描边路径 AI指定数量沿全路径混合小技巧 AI制版文字变粗...

    Illustrator描边路径 AI指定数量沿全路径混合小技巧 AI制版文字变粗 Illustrator/AI这种描边路径是怎么做出来的? 填充和路径都填充了,可是里面却没有填充的颜色 取消描边填充却 ...

  7. mac如何用python打开excel,Mac——利用Python读取与写入Excel文档

    Mac--利用Python读取与写入Excel文档 目的:按照自定义的格式写入或读取Excel文档,如标红加粗等 Python代码: import xlwt import pandas as pd d ...

  8. MAC系统Python环境搭建

    MAC系统Python环境搭建 Python环境搭建三部曲: 1.安装python 2.安装python编辑器pycharm 3.编写第一个python程序 首先,安装Python ,我下载的是版本3 ...

  9. installshield安装文件的制作小技巧--附加数据库

    installshield安装文件的制作小技巧--附加数据库 最近又一个项目接近尾声,不过对方要求安装必须傻瓜化,尽量不用手动配置.于是就的重新捡起两三年没有用过的installshield了.找到 ...

最新文章

  1. 监听Settings的值的变化
  2. Luogu4606 SDOI2018 战略游戏 圆方树、虚树、链并
  3. Entity Framework Relationships and Navigation Properties
  4. 在我生命里留下温暖记忆的一位老师
  5. C#使用HTTP头检测网络资源是否有效
  6. VS2008的网页报表可以直接打印了
  7. 第五十二期:甲骨文遭遇“中年危机”:继阿里后,再被亚马逊永久抛弃
  8. oracle trace 文件名,限制oracle trace 文件大小
  9. python文字游戏 生成数字菜单_pygame游戏之旅 游戏中添加显示文字
  10. 上海滩引爆数据中心热潮
  11. swift取代python_为什么Swift和Python要抛弃++\--?
  12. 问题:Cannot assign a device for operation Variable
  13. MySQL的存储函数与存储过程的区别
  14. 3dmax渲染计算机内存不足怎么办,解决3dmax渲染内存不够导致渲染失败的三种方法...
  15. python判断负数_python中的负数
  16. Asp开发中出现“msxml3.dll 错误 ‘800c0005‘系统未找到指定的资源
  17. 高等数学学习笔记——第七十六讲——直角坐标系下二重积分的计算
  18. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667L
  19. ubuntu终端字体大小和窗口大小设置
  20. shell递归遍历目录中的所有文件、文件夹

热门文章

  1. 断言assert与if
  2. 【疯壳·嵌入式平板开发教程1】手把手教你做平板电脑-Linux 引导过程
  3. 地图API总结与比较(GIS)
  4. UE4 伤害事件,不同部位不同伤害(C++)
  5. 价值感知:如何评价企业 IT 项目的价值?
  6. SQLite3数据库的快速入门菜鸟教程
  7. 24 | 固若金汤的根本(上):对称加密与非对称加密
  8. 形参和实参,传值和传址
  9. 用python求解牛顿插值函数(超详细)
  10. qq 请使用常用设备或手机号登录