在数据科学中,大多数项目都是协作完成的。 开发者会共享代码,数据,表格,图像等等。 这一切的背后都是 操作系统 (OS) 和文件系统。 在完美的世界中,当运行在 不同 的操作系统时,相同的程序会给出 相同 的输出。 不幸的是,世界并不总是如此。 一个常见的差异是不同系统的用户目录,对于 Windows 是 C:\Users\john\
,而对于 Linux 是 /home/john
。 这就是为什么讨论 文件系统最佳实践 很重要。
Julia 中内置了 处理不同操作系统差异 的功能。 这一部分位于 Julia 核心库 Base
的 Filesystem
模块。
每当需要处理 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
这是一个好习惯,因为它能为你或后来者避免问题。