导航菜单
首页 » 橙王爷 » 正文

wapi-Windows文件名非用反斜杠?Python小技巧帮你处理这个费事

选自medium

作者:Adam Geitgey

机器之心编译

参加:Geek AI、张倩

要想让你的 Python 代码一起在 Windows 和 Mac/Linux 上作业,你需求处理不同体系文件名用不同斜杠的问题。 而 Python 3 有一个名为「pathlib」的新模块,能够帮你处理这个费事。

要想让你的 Python 代码一起在 Windows 和 Mac/Linux 上作业,你需求处理不同体系文件名用不同斜杠的问题。 而 Python 3 有一个名为「pathlib」的新模块,能够帮你处理这个费事。

在编程过程中,咱们往往会遇到一个小费事——微软 Windows 体系在文件夹名之间运用反斜杠字符,而简直一切其它的计算机(操作体系)都运用正斜杠:

Windows filenames:

C:some_foldersome_file.txt

Most other operating systems:

/some_folder/some_file.txt

这是由于上世纪 80 时代前期计算机历史上的一个小意外。「MS-DOS」的第一版运用了正斜杠字符来指定命令行选项。当微软在「MS-DOS 2.0」中加入了对文件夹的支撑时,正斜杠字符现已被运用了,所以他们采用了反斜杠作为代替。35 年后,咱们依然被受困于这种不一致性。

假如你想让你的 Python 代码一起在 Windows 和 Mac/Linux 上作业,你就需求处理这种与渠道相关的问题。走运的是,Python 3 有一个名为「pathlib」的新模块,使得用户处理文件简直没有任何困难。

「pathlib」模块链接:https://docs.python.org/3/library/pathlib.html

让咱们快速阅读一下处理文件名途径的不同办法,看看「pathlib」怎么能让你的日子变得更夸姣!

过错的处理方案:手动构建文件途径

假定你有一个数据文件夹,该文件夹包括你想要在你的 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 体系,所以我wapi-Windows文件名非用反斜杠?Python小技巧帮你处理这个费事运用了「Unix」风格的正斜杠对途径进行了硬编码。这也会让 Windows 的用户感到愤恨。

从技能上讲,这段代码在 Windows 上依然有用,由于 Python 有一个「黑客」(hack)技能:当你在 Windows 上调用「open」函数时,它会辨认这两种斜线。但即便如此,你也不应该依靠它。假如你在过错的操作体系上运用了过错类型的斜杠(尤其是在它们与外部程序或代码库交互时),并不是一切的 Python 库都会正常作业。

Python 对混合斜杠类型的支撑是一种只针对 Windows 的「黑客」技能,它反过来并不起作用。在 Mac 体系环境下,在代码中运用反斜杠会导致完全失利:

data_folder = "source_datatext_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_datatext_filesraw_data.txt'

由于一切这些原因以及其他原因,运用硬编码的途径字符串编写代码,是一种会让其他程序员十分「厌弃」的做法。一般来说,你应该尽量防止这么做。

曾经的处理方案:Python 的「os.path」模块

Python 的「os.path」模块有许多东西来处理这类针对特定操作体系的文件体系问题。

你能够运用「os.path.join」为当时的操作体系构建一个运用正确类型斜杠的途径字符串:

importos.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」模块中的大多数wapi-Windows文件名非用反斜杠?Python小技巧帮你处理这个费事函数运用起来很烦人,开发者们通常会「忘掉」运用它们,即便他们知道这样做更好。这导致呈现了许多跨渠道的 Bug,也引起了用户的愤恨。

更好的处理方案:Python 3 的「pathlib」!

为了处理文件和途径,Python 3.4 引入了一个名为「pathlib」的新规范库,并且十分好用!

要运用该库,你只需运用正斜杠将一个途径或文件名传给一个新的「Path」目标,然后它将处理余下的操作:

frompathlib importPath

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 的一个很好的弥补了。可是,它还能做更多!

例如,咱们能够在无需翻开和封闭文件的情况下,读取文本文件的内容:

frompathlib importPath

data_folder = Path( "swapi-Windows文件名非用反斜杠?Python小技巧帮你处理这个费事ource_data/text_files/")

file_to_open = data_folder / "raw_data.txt"

print(file_to_open.read_text)

专业提示:之前的示例是有 Bug 的,由于翻开的文件从来没有被封闭过。而这儿的这种语规律完全防止了这个 Bug。

事实上,「pathlib」使大多数规范的文件操作变得快速而简略:

frompathlib importPath

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"

ifnotfilename.exists:

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

else:

print( "Yay, the file exists!")

你乃至能够运用「pathlib」显式地将一个「Unix」途径转化为一个「Windows」格局的途径:

frompathlib importPath, 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_datatext_filesraw_data.txt"

假如你真的想安全地在你的代码中运用反斜杠,你能够依照「Windows」格局声明你的途径,而「pathlib」能够对其进行转化,使其能在当时的操作体系中作业:

frompathlib importPath, PureWindowsPath

# I've explicitly declared my path as being in Windows format, so I can us满文军李俐e forward slashes in it.

filename = PureWindowsPath( "source_datatext_filesraw_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_datatext_filesraw_data.txt" on Windows

假如你想把代码写得更「高档」一些,你乃至能够运用「pathlib」来做比如解析相对途径、解析网络共享途径并生成「file:// urls」之类的事。鄙人面的比如中,咱们将仅仅运用两行代码,在你的 web 阅读器中翻开一个本地文件夹:

frompathlib importPath

importwebbrowser

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

webbrowser.open(filename.absolute.as_uri)

这仅仅「pathlib」的优点之一。它很好地代替了曩昔涣散在不同 Python 模块中与文件相关的许多不同功用。

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

二维码