Mathematica 文件操作(笔记)

                     

贡献者: graviton; addis

  • 本文处于草稿阶段。
  • 本文存在未完成的内容。

1. 常用环境变量

   Mathematica 中包含了常用的标准文件操作, 同时也可以将算法和高级编程应用于文件和系统管理任务。此介绍主要参考官方页面:

   一个重要的原则是:不要直接使用 裸字符串 硬编码 文件名/文件路径, 这样生成的路径依赖于操作平台的规范,相反:

   如需获得操作系统细节,可使用:

文件后缀名使用惯例

   GetNeedsImportInstall 等函数读取本地文件时,默认使用的搜索路径为 $Path。 全局变量 $Path 被定义为字符串的列表,其中每个字符串代表一个目录。 每次你要求打开文件时,Wolfram 就依次将这些目录暂时设置为当前工作目录,然后从该目录中尝试寻找你要求的文件。 也就是说,如果两个目录中含有同名的文件,排在前面的目录优先,不过你可以通过提供更详细的上层路径来避免歧义。 在 $Path 的典型设置中,当前目录和你的主目录(分别用 ~ 表示)被列在最前。

预定义的环境变量

   Wolfram 系统所使用的绝大多数文件都与操作系统无关。 然而,mx.exe 文件与系统有关。 对于这些文件,按照惯例,捆绑上不同计算机系统版本的名称, 形式如 name/$SystemID/name

2. 笔记本界面中的接口

打开笔记本

保存和关闭笔记本

3. 操作文件和目录

设置工作目录

常用目录操作

查找文件

文件名与拓展名

计算绝对路径

组合路径

4. 应用举例:计算包的本地根目录

   假设你有一些 MMA 脚本组成的工程,它们的根目录为 root。 在脚本中我们经常需要找出工程的根目录,以便于将脚本移动其他路径、甚至其他操作系统时, 能够不影响代码的正常运行。

   一个简单的实现是:首先我们建立具有特殊文件名的 锚点: 例如在 root 中新建 init.wl 文件(或者别的名字,但后面要相应更改)。并写入以下代码:

(*定义程序包的根目录*)
$srcRoot=AbsoluteFileName[DirectoryName[
If[$Notebooks,NotebookFileName[],$InputFileName],1]]
如此,$srcRoot 变量将保存项目的根目录位置。 在其他项目文件(.nb, .m, .wl……)中,添加以下代码:
(*本文件的名称*)
$fileName=If[$Notebooks,NotebookFileName[],$InputFileName];
(*如果在前端执行,就刷新笔记本的标题*)
Once@If[$Notebooks,NotebookWrite[Cells[][[1]],
Cell[Last@FileNameSplit[$fileName],"Title"]]];
(*查找 init.wl, 导入根目录和函数定义*)
Once@Catch@Module[{recurFind,start=1,depMax},
depMax=FileNameDepth[$fileName];(*路径的最大层次*)
(*-------定义递归函数-------*)
recurFind[dep_Integer]:=If[dep<=depMax,
SetDirectory[DirectoryName[$fileName,dep]];
(*如果在当前层能找到 init.wl,就运行它,并把根目录添加到搜索路径*)
If[FileExistsQ["init.wl"],
Get["init.wl"];PrependTo[$Path,$srcRoot];
Throw["The base directory is : "<>$srcRoot];,
(*如果这一层找不到,就上升一层*)
recurFind[dep+1]];
ResetDirectory[];(*重设为之前的目录*),
Throw["I cann't find any init.wl in this project"]];
recurFind[start];
]
(* 记录 master Kernel 的运行模式, 可在并行计算中使用 *)
$inNBook=$Notebooks;echo[DateString[]," <<",$fileName];
运行之后,此脚本文件路径保存在 $fileName 中,工程根目录保存在 $srcRoot 中。 上面已经将根目录添加到 $Path 变量中,因此可以只用文件名调用同目录下的其他脚本:
Get["其他脚本名称.wl"]

                     

© 小时科技 保留一切权利