读写 Mathematica 文件

在外部文件中存储 Mathematica 表达式

用户可以在自己的计算机系统中使用文件存储 Mathematica 的定义和结果. 最一般的方法是把所有东西都存储为Mathematica 输入的普通文本. 用这种方法,在某一计算机系统上运行的 Mathematica 生成的文件可以被任何计算机上运行的 Mathematica 阅读. 此外,这种文件可以由其它标准程序,如文本编辑器进行处理.

<<fileGet["file"]Mathematica 输入文件中读取,并返回文件中的最后的表达式
FilePrint["file"]显示文件的内容
expr>>file Put[expr,"file"]把表达式输出到作为普通文本的文件
expr>>>filePutAppend[expr,"file"]把表达式添加到文件中

读、写文件.

这里展开 ,并把结果输出到名为 的文件.
In[1]:=
Click for copyable input
这里是 的内容. 它能直接用作 Mathematica 输入.
这是从 文件中读取,并计算它包含的 Mathematica 输入.
In[3]:=
Click for copyable input
Out[3]=
这里显示文件 的内容.
这里读取该文件,并返回文件的最后一个表达式.
In[2]:=
Click for copyable input
Out[2]=
Mathematica 找不到所要文件时,它显示一个信息,并且返回值为 $Failed.
In[19]:=
Click for copyable input
Out[19]=

<<file 读入文件时,Mathematica 返回值为文件中的最后一个表达式. 为了不让此结果显示,可以在文件的最后一个表达式中用分号,或者直接在最后加 Null.

Mathematica 读入文件时发现语法错误,它就报告此错误,忽略文件余下的部分,返回值为 $Failed. 但如果语法错误发生在使用 BeginPackage 和其它上下文操作函数的程序包中,Mathematica 就尽量恢复读入程序包以前的状态.

保存多个 Mathematica 表达式

Mathematica 的输入文件可以包含任意数目的表达式. 然而,每个表达式必须从新的一行开始. 它可以占有许多行. 在标准交互式 Mathematica 对话中,当表达式完成后就进行处理. 注意,在一个文件中,与交互式对话不同,可以在任何位置插入一个空行,这不产生任何影响.

时,Mathematica 把新表达式加在文件之后. 而用 时,Mathematica 清除文件中所有内容,然后把 expr 写入文件.

将一个表达式写入文件 .
In[4]:=
Click for copyable input
这是该文件的内容.
在同一文件中加了另一表达式.
In[6]:=
Click for copyable input
此时文件中有两个表达式.

如果用户熟悉命令行操作系统,则会认出 Mathematica 重定向算符 与命令行算符 是相似的.

用不同形式保存 Mathematica 表达式

当用 向文件写入表达式时,这些表达式一般是 Mathematica 用输入形式,以便再将他们读入 Mathematica. 然而,有时需要用别的形式保存表达式. 这可以通过将这些表达式包含在 OutputForm 等格式指令中来实现.

这里按输出形式将一个表达式写入文件 .
In[8]:=
Click for copyable input
此时 文件中的表达式是输出形式.

保存 Mathematica 对象的定义

使用文件的最常用的目的是保存 Mathematica 对象的定义,以便在随后的 Mathematica 对话中再读入它们. 算符 Mathematica 表达式保存在文件中. 也可以使用函数 Save 按适当的形式取保存 Mathematica 对象的完整定义,以便在随后的 Mathematica 对话中执行.

Save["file",symbol]将一个符号的完整定义存入一个文件
Save["file","form"]保存符号名与字符串模式 form 匹配的定义
Save["file","context`"]保存指定上下文中所有符号的定义
Save["file",{object1,object2,...}]保存一些对象的定义

在普通文本中保存定义.

给符号 指定一个值.
In[51]:=
Click for copyable input
Out[51]=
Save 的定义写入文件.
In[52]:=
Click for copyable input
这是在文件中保存的 的定义.
这里定义了与以前给出的符号 有关的函数 .
In[54]:=
Click for copyable input
这里将 的完整定义存入一个文件.
In[55]:=
Click for copyable input
该文件不仅包含了 本身的定义,也有 所依赖符号 的定义.
这里清除 的定义.
In[57]:=
Click for copyable input
通过从文件 中读取可重新使用保存的定义.
In[58]:=
Click for copyable input
Out[58]=

函数 Save 利用输出形式 DefinitionFullDefinition,它们显示 Mathematica 符号的定义. 有时,直接用这些输出形式是很方便的.

输出形式 Definition[f]f 的定义序列.
In[59]:=
Click for copyable input
Out[59]=
FullDefinition[f] 包含 f 所依赖对象的定义.
In[60]:=
Click for copyable input
Out[60]=

Mathematica 中定义一个对象时,该定义常常依赖于前面定义的其它对象. 如果要在后面的 Mathematica 对话中重新构造这个对象的定义,这就需要保存该定义本身和与它有关的其它对象的定义. 函数 Save 检查要保存的定义,自动地保存与它们有关的定义. 然而,为了不存入太多不必要的内容,Save 不包含属性为 Protected 的符号的定义. 它认为这些符号的定义是内部给出的. 尽管如此,为了照顾这些定义,在一个新的 Mathematica 对话中读入从 Save 产生的输出时,必须保证对象的定义与以前的完全一致.

用代码形式保存 Mathematica 定义

建立 Mathematica 输入文件时,通常文件仅包含可直接阅读和修改的"普通文本". 然而,有时还需要对文件的内容编码,使得它们不能直接阅读和修改,但还要求此文件能调入Mathematica 内. 这可以用 Mathematica 函数 Encode 实现.

Encode["source","dest"]将文件 source 的代码形式写入文件 dest
<<dest读入一个代码文件
Encode["source","dest","key"]用特定键编码
Get["dest","key"]读入一个用一个键编码的文件
Encode["source","dest",MachineID->"ID"]产生一个仅能在特定ID的机器读入的代码文件

产生和读入代码文件.

将表达式按简明文本形式写入文件 .
In[61]:=
Click for copyable input
将文件 的代码形式写入文件 .
In[62]:=
Click for copyable input
这里是代码文件的内容. 能识别的部分仅是在开头的 Mathematica 注解.
即使代码文件,也可以用运算符 读入 Mathematica.
In[64]:=
Click for copyable input
Out[64]=
DumpSave["file.mx",symbol]Mathematica 内部格式保存符号的定义
DumpSave["file.mx","context`"]保存上下文中所有符号的定义
DumpSave["file.mx",{object1,object2,...}]保存几个符号或上下文的定义
DumpSave["package`",objects]按指定名的定义存入一个文件

Mathematica 内部格式保存定义.

在必须读入很大或很复杂的定义时,按 Mathematica 内部格式保存比按文本保存方便. 这可以用 DumpSave 实现.

Mathematica 内部格式保存 的定义.
In[22]:=
Click for copyable input
Out[22]=
仍可用 去读入这个定义.
In[23]:=
Click for copyable input

当一个文件含有 Mathematica 内部定义时, 能识别它并进行相应的操作. Mathematica 内部格式在不同的计算机系统有细微的差异. 于是在一个计算机上产生的 一般不能在别的计算机上读入.

DumpSave["package`", ...] 时,Mathematica 就将定义写到名为 等文件中,其中 system 指明所使用的计算机系统.

这里产生的文件名反映了所使用的计算机系统.
In[24]:=
Click for copyable input
Out[24]=
自动选择名称与所用计算机系统相关的文件.
In[25]:=
Click for copyable input
New to Mathematica? Find your learning path »
Have a question? Ask support »