一文弄懂Python在Windows/Mac/Linux上路径兼容问题

文摘   科技   2024-08-14 08:13   湖北  








01


引言





大家好,我是AI算法之道!


Python是我最喜欢的编程语言之一,它向来以其简单性、多功能性和可读性而闻名。


在Python编程中的一个小麻烦是,微软的windows在文件夹名称之间使用反斜杠字符,而几乎所有其他操作系统都使用正斜杠:

Windows filenames:C:\some_folder\some_file.txt
Most other operating systems:/some_folder/some_file.txt

这是 20 世纪 80 年代初计算机历史上的一个意外。MS-DOS 的第一个版本使用正斜杠字符来指定命令行选项。当微软在 MS-DOS 2.0 中添加对文件夹的支持时,正斜线字符已经被使用,因此他们使用了反斜线字符。35 年后的今天,我们仍然无法摆脱这种不兼容性。

在本文中,我们将深入探讨Python中处理文件路径的小技巧,希望可以帮助到大家!





02


手工拼接文件路径

假设我们有以下一个数据文件夹,其中包含一个要在 Python 程序中打开的文件:

以下是在 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 有一个黑客技术,当你在 Windows 上调用 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'
基于以上原因,使用硬编码路径字符串编写代码会让其他程序员对你的代码水平产生极大的怀疑。一般来说,大家应该尽量避免这样做。




03


 使用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 模块中的大多数函数在使用时都同样令人讨厌,因此开发人员经常会 "忘记 "使用这些函数,即使他们知道更好的方法。这导致了大量跨平台错误和愤怒的用户。



04


 使用Python3中的Pathlib


Python 3.4中引入了一个处理文件和路径的新标准库,名为 pathlib,它非常棒!

要使用它,只需使用正斜线将路径或文件名传入一个新的 Path() 对象,剩下的就交给它处理了:

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() 对象将为当前操作系统把正斜线转换成正确的斜线类型。
  • 如果你想在路径上添加内容,可以直接在代码中使用 / 操作符。告别一遍又一遍地输入 os.path.join(a,b)。


这就是 pathlib处理文件路径的基本功能,它是 Python 的一个很好的补充,但它的功能远不止这些!我们在下一节进行讲解。





05


Pathlib其他功能


我们可以利用pathlib来直接读取文本文件的内容,而无需显示打开和关闭文件:

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())

事实上,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 formatpath_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 systemcorrect_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

这只是 pathlib 的一小部分。它很好地替代了过去分散在不同 Python 模块中的大量与文件操作相关的功能。推荐大家可以多多接触pathlib库中关于路径处理的小技巧。







06


总结


本文重点介绍了python中如何利用不同方法实现不同操作系统下文件路径的兼容性处理技巧,希望这些小技巧可以帮助到大家,提升大家的工作效率!



您学废了吗?






点击上方小卡片关注我




添加个人微信,进专属粉丝群!


AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
 最新文章