Python技巧|Windows文件名不使用反斜杠计算机(操作系统)都使用正斜杠:Windowsfilenames:C:some_foldersome_file.txtMostotheroperatingsystems:/some_folder/some_file.txt这是由于1980年代初期计算机历史上的一个小意外。“MS-DOS”的第一个版本使用正斜杠字符来指定命令行选项。当Microsoft在MS-DOS2.0中添加对文件夹的支持时,已经使用了正斜杠字符,所以他们改用反斜杠。35年后,我们仍然受困于这种不一致。如果你想让你的Python代码同时在Windows和Mac/Linux上运行,你需要处理这个平台相关的问题。幸运的是,Python3有一个名为“pathlib”的新模块,可以轻松处理文件。让我们快速浏览一下处理文件名路径的不同方式,看看“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上,所以我使用的是“Unix”样式的正斜杠栏对路径进行硬编码。这也会让Windows用户生气。从技术上讲,这段代码在Windows上仍然有效,因为Python有一个“hack”:当您在Windows上调用“open()”函数时,它会识别两种斜杠。但即便如此,你也不应该依赖它。如果您在错误的操作系统上使用错误类型的斜线(尤其是当它们与外部程序或代码库交互时),并非所有Python库都能正常工作。Python对混合斜杠类型的支持是一种仅限Windows的“hack”,反之则不起作用。在Mac上,在代码中使用反斜杠会导致完全失败:data_folder="source_data\text_files\"file_to_open=data_folder+"raw_data.txt"f=open(file_to_open)print(f.read())#OnaMac,thiscodewillthrowanexception:#FileNotFoundError:[Errno2]Nosuchfileordirectory:source_data\text_files\raw_data.txt出于所有这些原因以及更多原因,使用硬编码路径字符串编写代码是其他程序员“不喜欢”的一种做法。一般来说,你应该尽量避免这样做。以前的解决方案:Python的“os.path”模块Python的“os.path”模块有很多工具可以处理这些特定于操作系统的文件系统问题。您可以使用“os.path.join()”为当前操作系统使用正确类型的斜线构造路径字符串:importos.pathdata_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”模块中的大多数函数使用起来很烦人,开发人员经常“忘记”使用它们,即使他们知道这样做更好。这导致了许多跨平台错误和用户的愤怒。更好的解决方案:Python3的“pathlib”!为了处理文件和路径,Python3.4引入了一个名为“pathlib”的新标准库,它非常棒!要使用该库,您只需使用正斜杠将路径或文件名传递给新的“Path()”对象,它将处理其余部分:txt"f=open(file_to_open)print(f.read())在这里,有两点需要注意:如果使用“pathlib”函数,则应使用正斜杠。“Path()”函数会将正斜杠转换为适合当前操作系统环境的正确斜杠。竖起大拇指!如果要添加到路径中,可以直接在代码中使用“/”运算符。您不必一遍又一遍地键入“os.path.join(a,b)”。如果这就是“pathlib”所做的全部,那么它已经是对Python的一个很好的补充。但是,它可以做得更多!例如,我们可以在不打开和关闭文件的情况下读取文本文件的内容:frompathlibimportPathdata_folder=Path("source_data/text_files/")file_to_open=data_folder/"raw_data.txt"print(file_to_open.read_text())提示:前面的例子是错误的,因为打开的文件从未关闭过。这里的语法完全避免了这个错误。事实上,“pathlib”使大多数标准文件操作变得快速和容易:"txt"print(filename.stem)#prints"raw_data"ifnotfilename.exists():print("Oops,filedoesntexist!")else:print("Yay,thefileexists!")你甚至可以使用"pathlib"显式转换一个“Windows”格式路径的“Unix”路径:frompathlibimportPath,PureWindowsPathfilename=Path("source_data/text_files/raw_data.txt")#ConvertpathtoWindowsformatpath_on_windows=PureWindowsPath(filename)print(path_on_windows)#prints"source_dataext_filesaw_data.txt"如果你真的想要为了在你的代码中安全地使用反斜杠,你可以以“Windows”格式声明你的路径,“pathlib”可以转换它,以便它可以在当前操作中使用在系统中工作:frompathlibimportPath,PureWindowsPath#IveexplicitlydeclaredmypathasbeinginWindowsformat,soIcanuseforwardslashesinit.filename=纯温多wsPath("source_data\text_files\raw_data.txt")#Convertpathtotherightformatforthecurrentoperatingsystemcorrect_path=Path(filename)print(correct_path)#prints"source_data/text_files/raw_data.txt"onMacandLinux#prints"source_dataext_filesaw_data.txt"onWindows如果你想写更“高级”的代码,你甚至可以使用“pathlib"来解析相对路径、解析网络共享路径并生成"file://urls"在下面的示例中,我们将仅使用两行代码在Web浏览器中打开本地文件夹:frompathlibimportPathimportwebbrowserfilename=Path("source_data/text_files/raw_data.txt")webbrowser.open(filename.absolute().as_uri())这只是“pathlib”的好处之一。它很好地取代了过去分散在不同Python模块中的许多不同的文件相关函数。
