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"]


致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利