导入和导出

导入和导出数据
Import["file","Table"]
从文件中导入数据表
Export["file",list,"Table"]
list 导出到作为数据表的文件
导入和导出数据.
将一个数组导出到文件 out.dat 中:
文件 out.dat 的内容:
out.dat 的内容导入为一个数据表:
Import["file","Table"] 将处理多种表格数据,并自动推断其格式. Export["file",list,"Table"] 导出由制表符分隔的数据,其数的格式和C、Fortran的一样,如 2.3E5 等等.
Import["name.ext"]
导入数据并从文件名来推断数据的格式
Export["name.ext",expr]
导出数据,其格式可从文件名来推断
导入和导出一般数据.
table formats
matrix formats
specialized data formats
"DIF""FITS""HDF5""MPS""SDTS" 等等.
表格数据的一些共同格式.
ImportExport 不仅能处理表格数据,还能处理在于图形、声音甚至整个文件的数据. ImportExport 能通过文件的扩展名推断数据的格式. "导出图形和声音""文件的导入和导出" 更详细地讨论 ImportExport 是如何工作的. 注意,用户也能使用 ImportExport 处理二进制数据的原始文件.
导入一个 JPEG 格式的图形:
$ImportFormats
用户系统支持的导入格式
$ExportFormats
用户系统支持的导出格式
找出所支持的导入导出格式的完整列表.
文件的导入和导出
Import["file","List"]
从文件导入一个一维数据列表
Export["file",list,"List"]
将一个列表 list 导出为文件中的一维数据列表
Import["file","Table"]
从文件导入二维数据列表
Export["file",list,"Table"]
将一个列表 list 导出为文件中的二维数据列表
Import["file","CSV"]
以逗号分隔的格式导入数据
Export["file",list,"CSV"]
以逗号分隔的格式导出数据
数据集合的导入导出.
将数据列表导出到文件 out1 中:
该文件的内容:
将这些内容重新导入到 Wolfram 语言中:
如果仅在 Wolfram 语言中使用数据,在文件中保存的最好方式通常是作为一个保持其结构的完整 Wolfram 语言表达式,如在 "读写 Wolfram 语言文件:文件和流" 中讨论的. 但要和其他程序进行数据交换时,将数据整理为简单列表或表格形式是方便的.
导出一个二维数据阵列:
必要时,这些数用 C 或 Fortran 中的记号 E 来书写:
将这个阵列又导入到 Wolfram 语言:
当文件中的每行仅有一个数字时,可以用 Import["file","List"] 将该文件的内容导入为一个数的列表. 如果每行是由 tabs 、空格等分隔的数字组成时,Import["file","Table"] 就会产生一个数的列表的表列. 当这个文件含有非数字项时,则其返回值是 Wolfram 语言字符串.
混合导出了文本和数据:
导出的数据:
将该数据又导入到 Wolfram 语言中:
InputForm 可以直接看到字符串:
Import["file","List"]
将每一行分别作为数字或其他数据项
Import["file","Table"]
将各行的每一个元素分别作为一个数字或其他数据项
Import["file","String"]
将整个文件作为一个单独的字符串
Import["file","Text"]
将整个文件作为一个文本字符串
Import["file",{"Text","Lines"}]
将每一行作为一个文本字符串
Import["file",{"Text","Words"}]
将每一个分离的词作为一个文本字符串
按不同格式导入文件.
产生一个有两行文本的文件:
文件的内容:
将文件导入为一个字符串:
将文件导入为文本行的列表:
将文件导入为按空格分隔的词的列表:
导出图形和声音
Wolfram 语言允许用户从多种格式导出图形和声音. 如果使用 Wolfram 语言笔记本前端,那么用户可以使用自己的计算机系统上的标准技巧,直接把图形和声音复制和粘贴到其他的程序中.
Export["name.ext",graphics]
按从文件名得出的格式输出图形
Export["file",graphics,"format"]
按指定格式输出声音
Export["!command",graphics,"format"]
把图形输出到一个外部命令
Export["file",{g1,g2,},]
为动画输出一系列图形
ExportString[graphics,"format"]
产生一个所输出图形的字符串表达式
输出 Wolfram 语言图形和声音.
"EPS"
Encapsulated PostScript ( .eps )
"PDF"
Adobe Acrobat 袖珍文档格式 ( .pdf )
"SVG"
可扩展向量图形 ( .svg )
"PICT"
Macintosh PICT
"WMF"
Windows metafile 文件格式 ( .wmf )
"TIFF"
TIFF (.tif.tiff)
"GIF"
GIF 及动画 GIF ( .gif )
"JPEG"
JPEG (.jpg.jpeg)
"PNG"
PNG 格式 ( .png )
"BMP"
Microsoft 位图格式 ( .bmp )
"PCX"
PCX 格式 ( .pcx )
"XBM"
X window 系统位图 ( .xbm )
"PBM"
袖珍位图格式 ( .pbm )
"PPM"
袖珍像元映射格式 ( .ppm )
"PGM"
袖珍灰度映射格式 ( .pgm )
"PNM"
袖珍任意映射格式 ( .pnm )
"DICOM"
DICOM 医学图像格式 (.dcm.dic)
"AVI"
音频视频交错格式 ( .avi )
Wolfram 语言支持的典型图形格式 (第一组格式与分辨率无关).
生成一个图形:
用 Encapsulated PostScript 格式导出该图形:
向 Wolfram 语言外部输出图形时,需要指定所产生图形的绝对尺寸,这可以通过对 Export 使用 ImageSize 选项来实现.
ImageSize->x 使得图形的宽度为 x 个打印点,而 ImageSize->72xi 使宽度为 xi 英寸. 默认设置产生的图宽为4英寸. ImageSize->{x,y} 调节图形尺寸使其能放在 x×y 的区域内.
ImageSizeAutomatic
用打印点度量的图形绝对尺寸
"ImageTopOrientation"Top
是否旋转图形
ImageResolutionAutomatic
用 dpi 度量的图形分辨率
Export 选项.
在 Wolfram 语言中,图形的处理不依赖于屏幕或其他输出设备的分辨率.
许多程序和设备接收 Encapsulated PostScript (EPS)等与分辨率无关的格式的图形. 但一些需要将图形在指定的分辨率内转换为光栅或二进制映射. Export 的选项 ImageResolution 可以决定使用多少dpi分辨率. 这个值设置得越小,图形的质量就越差,所需的内存就越小. 屏幕显示时,典型的设置是72dpi或更大,打印时设置300dpi或更大.
"DXF"
AutoCAD 绘图交换格式 ( .dxf )
"STL"
STL 立体格式 ( .stl )
Wolfram 语言支持的典型三维几何数据格式.
"WAV"
Microsoft 波格式 ( .wav )
"AU"
μ 律编码 ( .au )
"SND"
声音文件格式 ( .snd )
"AIFF"
AIFF 格式 (.aif.aiff)
Wolfram 语言支持的典型声音格式.
开发导入转换器
Wolfram 语言提供了允许用户员实现文件格式转换的功能,该功能与 Wolfram 语言 ImportExport 框架相集成. 用户可以实现格式转换,并且使用 Import 从任意格式导入数据.
Wolfram 语言也提供了显示格式转换器如何实现与注册的开源代码. 这些代码位于文件夹 $InstallationDirectory/SystemFiles/Formats/format 中,其中 format 是下列格式之一: BDFDIFMTPSMILESSurferGridTGFTLE. 注册代码位于文件 Import.m 或者 Export.m 中,而转换器实现位于文件 Converter.m.
Import 和底层转化函数之间的界面由 RegisterImport 指定(在 ImportExport` 上下文下). 大体上,当导入一个文件格式的特定元素时,RegisterImport 告诉 ImportExport框架如何调用特定函数.
本教程使用如下专有名词:
底层函数 将文件或者流视为输入,并且返回包含导入数据的规则列表. 这里有两种类型的底层函数:(1) 默认导入器,当导入未显式注册的元素时,框架对其进行调用;(2) 条件导入器,将一个在 RegisterImport 的第二个变量中注册的特定元素导入.
后导入器 或者后导入函数,RegisterImport 的第三个变量中注册,将底层函数的输出作为输入处理.
下面总结了 RegisterImport 的一些形式. 本教程为用户提供了循序渐进的范例,详细介绍 RegisterImport 的各种使用.
ImportExport`RegisterImport["format",defaultFunction]
当导入一个类型为 "format" 的文件时,将单个 defaultFunction 注册为由 Import 框架所用的默认导入器
ImportExport`RegisterImport["format",{"elem1"conditionalFunction1,"elem2"conditionalFunction2,defaultFunction}]
注册由 Import 框架所用的多个元素 (elem1elem2) 和各自的转换器函数 (conditionalFunction1conditionalFunction2). 另外当所要求的元素与任何已注册元素都不匹配时,也注册所用的 defaultFunction
ImportExport`RegisterImport["format",{conditionalFuncs,defaultFunction}{"elem3"postFunction3,"elem4"postFunction4}]
注册额外的转换器函数,这些函数的输入是其中一个底层函数的输出

默认导入器

例如,假设我们有一个包含3个头行,接着是4个由数字组成的列的文件格式.

新格式的注册和实现

一个可能的设计是对 "Header""Data" 元素分别导入头信息和数字. 这也可以使用 RegisterImport 实现.
在这个特殊情况下,当导入格式为 "MyFormat1" 的任意元素时,我们告诉 ImportExport 框架来调用函数 MyFormat1`MyFormat1Import.
默认情况下,该框架把文件名传递给底层函数,因此 MyFormat1`MyFormat1Import 将文件名和选项集作为输入. 该函数必须以 ElementName->ElementValue 形式返回规则列表.

导入具有新格式的文件

Import 可以将 "MyFormat1" 作为一个有效文件格式使用.

条件原始导入器

当一个格式包括多个元素时,利用特定的底层函数导入特定的元素可能是有用并且有效的. 这可以通过将形如 "elem"->func 的规则列表作为 RegisterImport 的第二个变量给出来实现. 但是,该列表必须以默认导入器名称结束,其中该导入器在导入不与列表中明确定义的元素匹配的元素时被调用.

具有条件导入器的新格式的注册与实现

本注册方法告诉 ImportExport 框架如何导入格式为 "MyFormat2" 的文件:
(1) 当导入 "Data" 元素时,使用 MyFormat2`MyFormat2DataImport
(2) 对于所有其他元素,使用 MyFormat2`MyFormat2DefaultImport.
该底层函数具有相同的结构,采用一个文件名以及一个选项列表(可选),并且以 ElementName->ElementValue 形式返回规则集合.

利用 MyFormat2 导入

"MyFormat2" 的导入元素的输出与 "MyFormat1" 的相同,但是现在对这两个不同的元素调用两个不同的函数.

指定子元素

默认情况下,该框架利用 Part 导入子元素.
对于包含一些大型数据集的文件,直接导入特定的数据集可能是有效的. 例如,我们可以直接从格式为 "EDF" 的文件中导入一个数据集.
通过注册形如 {elem,subelem}lowlevelFunc 的底层函数,我们可以指定子元素的导入.{elem,subelem}lowlevelFunc.
底层函数的输出必须与 {elem->{subelem->output}} 形式匹配.
与前面的情况相同,另一些底层函数的输出必须是形如 elem->value 的规则列表.
现在,字符串子元素的导入调用适当的底层函数.

后导入器

可能的情况是,我们必须基于其他元素构建元素. 例如,如果要导入的数据是表示灰度图像的数字列表,那么导入 "Image" 元素要求首先导入 "Data" 元素. 在本章节中,我们有两个使用"Graphics""Image" 元素的例子.
当存在一个匹配的元素名称时,后导入器将条件导入器的输出作为输入;否则,后导入器将默认导入器的输出作为输入.
与条件导入器及默认导入器不同,后导入器只简单地返回元素值.

具有后导入器的新格式的注册与实现

为了说明条件导入器和后导入器的差异,我们使用两个额外的元素:"Graphics""Image" 来扩展 "MyFormat2". "Graphics" 元素通过一个条件导入器导入. 而 "Image" 元素由后导入器导入.
下面的注册方式告诉 ImportExport 框架如何导入格式为 "MyFormat3" 的文件:
(1) 对于 "Header" 或者 "Graphics" 元素,调用相应的条件导入器;
(2) 对于 "Image" 元素,首先调用默认的导入器,并且将其输出作为 MyFormat3`MyFormat3ImageImport 的输入;
(3) 对于所有其他元素,调用默认的导入器.
条件导入器和默认导入器与前面的导入器具有相同的结构.
注意,"Graphics" 导入器必须显式调用默认导入器,并且手动提取数据.
由于没有 "Image" 元素被注册为条件导入器,"Image" 元素的导入器将默认导入器的输出作为输入.

利用 MyFormat3 导入

从用户角度看,利用后导入函数或底层函数实现的元素之间没有差异.
"Graphics" 元素注册为条件导入器:
"Image" 元素的导入调用后导入器 MyFormat3`MyFormat3ImageImport

RegisterImport 的选项

RegisterImport 具有一些为我们提供很大灵活度的选项.

"FunctionChannels" 和 "BinaryFormat"

在上述例子中,底层函数把文件名作为一个变量接受,并且该函数打开该文件的流. 通过把 "FunctionChannels"->{"Streams"} 指定为 RegisterImport 的一个选项,该框架可以直接把 InputStream 传递给底层函数.
通过设置选项 "BinaryFormat"->True,该框架把一个二进制流传递给底层导入器.
"FunctionChannels" 的默认值是 {"FileNames"}. "BinaryFormat" 的默认值是 False.
范例
对于注册为
ImportExport`RegisterImport["format",eFunc,{},"FunctionChannels"->{"Streams"}]
的格式,eFunc 的签名为 eFunc[strm_InputStream,opts___],并且该框架把一个(非二进制)流传递给 eFunc.

"AvailableElements"

默认情况下,当导入一个未明确注册为条件导入器或后导入器的元素,该框架计算默认的导入器. 如果在默认的导入器中未找到匹配的元素,该框架产生一条错误信息,并且返回 $Failed.
通过设置选项 "AvailableElements"->{elem1,elem2,},当我们试图导入一个不在指定列表中出现的元素时,该框架将直接返回 $Failed,并且产生一个错误信息而不调用任何底层导入器.
范例
对于注册为
ImportExport`RegisterImport["format",{"elem1":>eFunc1,"elem2":>eFunc2,eDefaultFunc},{},"AvailableElements"->{"elem1","elem2","Data"}]
的格式,当我们调用 Import[filename,{"format","foo"}] 时,该框架将返回 $Failed,而不计算默认导入器 eDefaultFunc.
注意,指定 "AvailableElements" -> {"elem1","Data"} 是错误的. 在这种情况下,Import[filename,{"format","elem2"}] 将返回 $Failed,因为 "elem2" 不位于由"AvailableElements" 指定的列表中.

"DefaultElement"

设置 "DefaultElement"->elem,其中 elem 是元素名,当没有指定 Import 元素时,该框架导入 elem.

"Sources"

选项 "Sources"->{path1,path2,} 可用来指定 .m.mx 或者包含底层函数定义的 Wolfram Symbolic Transfer Protocol (WSTP) .exe 文件的文件路径. 该框架将自动使用适用于源文件的 Get 或者 Install.
开发导出转换器
Mathematica 提供了允许开发人员实现文件格式转换的功能,该功能与 Mathematica ImportExport 框架相集成. 用户可以实现格式转换,并且使用 Export 从自定义格式导出数据.
Export 和底层转换函数之间的界面由 RegisterExport 指定(在 ImportExport` 上下文下). 大体上,当把 Mathematica 表达式导出到一个文件格式时,RegisterExport 告诉 ImportExport 框架如何产生不同的函数调用.
Mathematica 也提供了不同转换器的源代码. 这些代码位于文件夹$InstallationDirectory/SystemFiles/Formats/format 中,其中 format 是其中之一:BDFDIFMTP SMILESSurferGridTGF、或 TLE. 注册代码位于文件 Import.m 和/或 Export.m 中,而转换器源代码位于文件 Converter.m.

格式注册

必须首先注册一个 Export 格式. 注意,与注册一个 Import 格式不同,RegisterExport 只接受一个函数.
ImportExport`RegisterExport["format",function]
当把一个文件导出到格式 format 时,注册 function 被用于 Export 框架中

编写转换函数

对于这个例子,考虑一个通过每个字符的 ASCII 码对一个 ASCII 字符串进行编码的文件,其中每个编码用单个空格分隔. 该格式的转换器函数可以使用 RegisterExport 添加到 ImportExport 框架中.
当我们使用 Export[file.ext,"str","MyExportFormat"] 时,该框架把输出文件名和数据 str 传递给导出器,使得一个范例导出器函数可以按如下方式编写:
"MyExportFormat" 可以在 Export 中与任何其他文件格式一样使用:

转换函数的元素和选项

Import 总是导入元素不同,Export 可以直接导出一个表达式(与上面的例子相同)或者形如 elementName->elementValue 的规则列表.
元素可以被指定为选项,意味着他们以及所有其他选项可以被传递给转换器函数. 下面我们使用一个简单的转换器来说明元素和选项的处理.
直接使用表达式导出:
通过元素导出:
通过带有选项的元素导出:
通过元素导出,其中的元素注册为选项:
注意,通过指定 "Options"->{"opt1","opt2"},元素 "opt1""opt2" 自动作为选项传递给导出器.
自动加载导入/导出转换器
ImportExport 界面外,Wolfram 语言中还自带一个自动加载机制,使 ImportExport 构架所用的格式注册简化.

自动与手动加载

手动加载

手动加载转换器的范例在教程中给出,在教程中我们对注册 "MyFormat1" 的指令执行显式计算.

自动加载

通过在适当位置放置格式注册和转换器,Wolfram 语言能够自动加载格式注册. ImportExport 转换器的自动加载可以通过下述步骤实现:
(在下述步骤中,您可以使用 $UserBaseDirectory$BaseDirectory.)
1. 如果目录 $UserBaseDirectory/SystemFiles/Formats 不存在,则创建该目录.
2.在 $UserBaseDirectory/SystemFiles/Formats 下,创建一个名为 format 的目录,其中 format 为要自动加载的格式名称.
3. 在 format 目录内部,将代码块 ImportExport`RegisterImport[] 放到名为 Import.m 的文件内.
举例来说,在目录 $UserBaseDirectory/SystemFiles/Formats/MyFormat1 中,文件 Import.m 含有如下内容:
4. 在 format 目录内部,将转换器源代码放入名为 Converter.m 的文件内.
例如,在目录 $UserBaseDirectory/SystemFiles/Formats/MyFormat1 内,文件 Converter.m 含有如下内容:
5. 有了这些文件,当 Wolfram 语言启动时,$ImportFormats 将包含 "MyFormat1" 一项,并且Import[ file,{"MyFormat1","Header"}] 将适当计算.
事实上,Wolfram 语言所支持的所有格式均使用自动加载机制注册,其中格式注册位于 $InstallationDirectory/SystemFiles/Formats.
此外,Wolfram 语言中的多种格式以源码形式存在于目录 $InstallationDirectory/SystemFiles/Formats 下.

注册机制细节

目录名必须与格式名匹配
使用自动加载机制时,文件夹名称必须与格式名匹配. 格式可以通过使用下列格式别名有效地进行重命名.
如果源文件不在标准位置,"Sources" 必须要显式给出
使用自动加载机制时,Import/Export 架构假定源文件位于 $UserBaseDirectory/SystemFiles/Formats/format/Converter.m 或$BaseDirectory/SystemFiles/Formats/format/Converter.m. 如果源文件位于其他位置,则必须使用 "Sources" 选项显式声明. 例如, "Sources"->{"MyFormatConverter/Converter.m","MyFormatConverter/Converter2.m" }.
解决冲突
如果存在冲突(例如,"MyFormat" 目录同时位于 $InstallationDirectory/SystemFiles/Formats 和 $UserBaseDirectory/SystemFiles/Formats),则 $UserBaseDirectory 中的注册具有最高优先级,其次是 $BaseDirectory$InstallationDirectory.

定义格式别名

定义格式别名往往很有用,这使得您可以用多个不同名称来指定一个格式. 假设您想要使用 "MyOtherFormat""MyDefaultFormat" 作为 "MyFormat1" 的别名,您可以通过创建含有下述内容的文件$UserBaseDirectory/SystemFiles/Formats/FormatMappings.m 实现.
别名具有与原格式同样的工作方式:
原格式返回同样的信息:
生成和导入 TeX
Wolfram 系统笔记本提供了创建技术文档的高级环境. 但是,如果用户想要把已有材料以 Tex 格式结合到自己的工作中. 那么使用 TeXForm 把 Wolfram 语言表达式转换成适合 Tex 输入的格式是很方便的.
TeXForm[expr]
以 Tex 输入格式打印 expr
Wolfram 语言表达式化为 Tex 格式.
一个用标准的 Wolfram 语言格式打印的表达式:
该表达式的 Tex 输入格式:
ToExpression["input",TeXForm]
把 TeX 输入转换成 Wolfram 语言格式
把 TeX 字符串转换成 Wolfram 语言格式.
把一个 TeX 字符串转换为 Wolfram 语言格式. 注意,字符串中需要双反斜线:
Wolfram 系统不但能将单个表达式转换成 TeX 格式,也提供了转换整个笔记本的功能. 通常以笔记本前端的 文件 另存为... 菜单中实现这个功能,在该菜单中可设置各种选项.
网络资料的交流
Export["file.html",nb]
以 HTML 形式保存笔记本 nb
把笔记本转换为 HTML 格式.
Export 有许多应用于 HTML 输出的选项,允许我们可以指定如何将笔记本转换为具有不同功能的网络浏览器.
MathMLForm[expr]
以 MathML 形式打印 expr
MathMLForm[StandardForm[expr]]
使用 StandardForm 而不是传统的数学符号
ToExpression["string",MathMLForm]
把一个 MathML 字符串解释为 Wolfram 语言输入
与 MathML 格式的互换.
以 MathML 形式打印的表达式:
如果把 MathML 粘贴到一个 Wolfram 语言笔记本,Wolfram 语言将自动试图转换为 Wolfram 语言输入. 用户可以使用笔记本前端的 复制为 菜单从笔记本以 MathML 拷贝一个表达式.     
Export["file.xml",expr]
以 XML 格式导出
Import["file.xml"]
从 XML 导入
ImportString["string","XML"]
从一个 XML 字符串导入数据
XML 的导入和导出.
与 Wolfram 语言表达式有些类似,XML 是用来代表数据的普通格式. Wolfram 语言自动对某些类型的表达式与特定类型的 XML 进行互换. MathML 是一个例子. 另一个例子是用于图形的 SVG.
如果要求 Wolfram 语言导入 XML 的一个通用块,将产生一个 SymbolicXML 表达式. 每个具有<elem attr='val'>data</elem> 形式的 XML 元素被翻译为具有 XMLElement["elem",{"attr"->"val"},{data}] 形式的一个 Wolfram 语言 SymbolicXML 表达式. 一旦以 SymbolicXML 导入一个 XML 块,则可以使用 Wolfram 语言强大的符号编程能力来处理得到的表达式. 然后可以使用Export 以 XML 形式导入结果.
产生一个 SymbolicXML 表达式,其中 XMLElement 代表 XML 字符串中的 a 元素:
SymbolicXML 上有两个嵌套层:
在 SymbolicXML 上做简单的转换:
以 XML 字符串形式显示结果:
Import["http://url",]
从任何可访问的 URL 导入文件
Import["ftp://url",]
从 FTP 服务器导入文件
从网络资源导入数据.
从一个网站导入图片: