您的位置
主页 > 国际新闻 » 正文

Windows文件名非用反斜杠?Python小技巧帮你解决这个麻烦

来源:www.onolishn.com 点击:1386

从中等

作者:Adam Geitgey

机器的核心编译

参与:Geek AI,Zhang Qian

为了使您的Python代码可以在Windows和Mac/Linux上运行,您需要使用不同的斜杠处理不同的系统文件名。 Python 3有一个名为“pathlib”的新模块可以帮助你解决这个问题。

在编程过程中,我们经常遇到一个小麻烦 Microsoft Windows系统在文件夹名称之间使用反斜杠字符,而且几乎所有其他计算机(操作系统)都使用正斜杠:

Windows文件名:

C: \\ some_folder \\ some_file.txt

大多数其他操作系统:

/some_folder/some_file.txt

这是由于20世纪80年代初计算机历史上的一次小事故。第一个版本的“MS-DOS”使用正斜杠字符来指定命令行选项。当Microsoft在“MS-DOS 2.0”中添加对文件夹的支持时,正斜杠字符已经被使用,因此他们使用了反斜杠。 35年后,我们仍然陷入这种不一致的境地。

如果您希望Python代码可以在Windows和Mac/Linux上运行,则需要处理此平台相关问题。幸运的是,Python 3有一个名为“pathlib”的新模块,这使得用户几乎不可能使用文件。

“pathlib”模块链接:

让我们快速浏览处理文件名路径的不同方法,看看“pathlib”如何让您的生活更美好!

错误的解决方案:手动构建文件路径

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

用Python编码是“错误的”:

Data_folder='source_data/text_files /'

File_to_open=data_folder +'raw_data.txt'

f=open(file_to_open)

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

打印(f.read())

#在Mac上,此代码将引发异常:

#FileNotFoundError: [Errno 2]没有这样的文件或目录:'ource_data \\\\ text_files \\\\ raw_data.txt'

由于所有这些原因以及其他原因,使用硬编码路径字符串编写代码是一种让其他程序员“反感”的方法。一般来说,你应该尽量避免这样做。

以前的解决方案:Python的“os.path”模块

Python的“os.path”模块有许多工具来处理特定操作系统的此类文件系统问题。

您可以使用os.path.join()为当前操作系统构建具有正确类型斜杠的路径字符串:

导入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)

打印(f.read())

此代码适用于“Windows”或“Mac”系统。问题是使用起来很麻烦。编写“os.path.join()”并将路径的每个部分作为单独的字符串传递给函数是非常冗长和不直观的。

由于“os.path”模块中的大多数功能都很难使用,开发人员经常“忘记”使用它们,即使他们知道它更好。这导致了许多跨平台的错误并引起用户的愤怒。

更好的解决方案:Python 3的“pathlib”!

为了处理文件和路径,Python 3.4引入了一个名为“pathlib”的新标准库,效果很好!

要使用该库,只需使用正斜杠将路径或文件名传递给新的“Path()”对象,它将处理剩余的操作:

来自pathlib导入路径

Data_folder=Path('source_data/text_files /')

File_to_open=data_folder /'raw_data.txt'

f=open(file_to_open)

打印(f.read())

在这里,有两点需要注意:

如果使用“pathlib”函数,则应使用正斜杠。 “Path()”函数将正斜杠转换为当前操作系统环境的正确斜杠。真棒!如果要在路径上添加,可以直接在代码中使用“/”运算符。您不再需要一遍又一遍地键入“os.path.join(a,b)”。

如果“pathlib”做了这么多,它已经是Python的一个很好的补充。但是,它可以做得更多!

例如,我们可以在不打开和关闭文件的情况下读取文本文件的内容:

来自pathlib导入路径

Data_folder=Path('source_data/text_files /')

File_to_open=data_folder /'raw_data.txt'

打印(file_to_open.read_text())

专业提示:前面的例子是错误的,因为打开的文件从未关闭。这个语法完全避免了这个错误。

实际上,“pathlib”使大多数标准文件操作变得快速而简单:

来自pathlib导入路径

Filename=Path('source_data/text_files/raw_data.txt')

打印(filename.name)

#printed'raw_data.txt'

打印(filename.suffix)

#printing'txt'

打印(filename.stem)

#printed'raw_data'

如果不是filename.exists():

打印('哎呀,文件不存在!')

否则为:

打印('是的,文件存在!')

您甚至可以使用“pathlib”将“Unix”路径显式转换为“Windows”格式路径:

从pathlib导入路径,PureWindowsPath

Filename=Path('source_data/text_files/raw_data.txt')

#将路径转换为Windows格式

Path_on_windows=PureWindowsPath(文件名)

打印(path_on_windows)

#printing'source_data \\ text_files \\ raw_data.txt'

如果你真的想在代码中安全地使用反斜杠,你可以用“Windows”格式声明路径,“pathlib”可以将它转换为在当前操作系统中工作:

从pathlib导入路径,PureWindowsPath

#我已明确声明我的路径是Windows格式,因此我可以在其中使用正斜杠。

Filename=PureWindowsPath('source_data \\\\ text_files \\\\ raw_data.txt')

#将路径转换为当前操作系统的正确格式

Correct_path=路径(文件名)

打印(correct_path)

#在Mac和Linux上打印'source_data/text_files/raw_data.txt'

#在Windows上打印'source_data \\ text_files \\ raw_data.txt'

如果你想编写更“高级”的代码,你甚至可以使用“pathlib”来解析相对路径,解析网络共享路径以及生成“file: //urls”。在以下示例中,我们将仅使用两行代码在Web浏览器中打开本地文件夹:

来自pathlib导入路径

导入webbrowser

Filename=Path('source_data/text_files/raw_data.txt')

Webbrowser.open(filename.absolute()。as_uri())

这只是“pathlib”的好处之一。它是许多与过去分散在不同Python模块中的文件相关的不同功能的绝佳替代品。

原始链接:

澳门威尼斯人贵宾专线