3.4 文件系统

在数据科学中,大多数项目都是协作完成的。 开发者会共享代码,数据,表格,图像等等。 这一切的背后都是 操作系统 (OS) 和文件系统。 在完美的世界中,当运行在 不同 的操作系统时,相同的程序会给出 相同 的输出。 不幸的是,世界并不总是如此。 一个常见的差异是不同系统的用户目录,对于 Windows 是 C:\Users\john\,而对于 Linux 是 /home/john。 这就是为什么讨论 文件系统最佳实践 很重要。

Julia 中内置了 处理不同操作系统差异 的功能。 这一部分位于 Julia 核心库 BaseFilesystem 模块。

每当需要处理 CSV,Excel 文件或其他 Julia 脚本时,请确保代码能够运行 在不同操作系统的文件系统 上。 这可以通过 joinpath@__FILE__pkgdir 函数轻松实现。

当在包中开发代码时,可以使用 pkgdir 获取包的根目录。 例如,对于用来生成本书的 Julia Data Science (JDS) 包:

/home/runner/work/JuliaDataScience/JuliaDataScience

如上所示,用来生成本书的代码运行在 Linux 电脑上。 在使用脚本时,可以使用如下方式获得脚本文件的路径:

root = dirname(@__FILE__)

这两条命令的优点是它们与启动 Julia 的方式无关。 换句话说,无论以 julia scripts/script.jl 还是 julia script.jl 方式启动程序,两种方式每次返回的路径都是相同的。

接下来建立从 root 到脚本文件的相对路径。 因为不同的操作系统采用不同的方式组织子文件夹的相对路径(一些采用斜杠 /,而另一些使用反斜杠 \),所以不能简单地通过字符串连接组合 root 路径与文件的相对路径。 因此需要使用 joinpath 函数,它将根据特定的文件系统实现,采用相应的方式连接不同的相对路径和文件名。

假设项目目录中存在一个名为 my_script.jl 的脚本。 my_script.jl 文件路径的健壮实现如下所示:

joinpath(root, "my_script.jl")
/home/runner/work/JuliaDataScience/JuliaDataScience/my_script.jl

joinpath 也能处理 子目录。 接下来考虑一种普遍的情形,项目目录中有一个名为 data/ 的子文件夹。 此文件夹中有一个名为 my_data.csv 的 CSV 文件。 同样地,此 my_script.jl 文件路径的健壮实现如下所示:

joinpath(root, "data", "my_data.csv")
/home/runner/work/JuliaDataScience/JuliaDataScience/data/my_data.csv

这是一个好习惯,因为它能为你或后来者避免问题。



CC BY-NC-SA 4.0 Jose Storopoli, Rik Huijzer, Lazaro Alonso, 刘贵欣 (中文翻译), 田俊 (中文审校)