导入和导出
Import["file","Table"] 将处理多种表格数据,并自动推断其格式. Export["file",list,"Table"] 导出由制表符分隔的数据,其数的格式和C、Fortran的一样,如 2.3E5 等等.
Import 和 Export 不仅能处理表格数据,还能处理在于图形、声音甚至整个文件的数据. Import 和 Export 能通过文件的扩展名推断数据的格式. "导出图形和声音" 和 "文件的导入和导出" 更详细地讨论 Import 和 Export 是如何工作的. 注意,用户也能使用 Import 和 Export 处理二进制数据的原始文件.
$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"] | 以逗号分隔的格式导出数据 |
如果仅在 Wolfram 语言中使用数据,在文件中保存的最好方式通常是作为一个保持其结构的完整 Wolfram 语言表达式,如在 "读写 Wolfram 语言文件:文件和流" 中讨论的. 但要和其他程序进行数据交换时,将数据整理为简单列表或表格形式是方便的.
当文件中的每行仅有一个数字时,可以用 Import["file","List"] 将该文件的内容导入为一个数的列表. 如果每行是由 tabs 、空格等分隔的数字组成时,Import["file","Table"] 就会产生一个数的列表的表列. 当这个文件含有非数字项时,则其返回值是 Wolfram 语言字符串.
用 InputForm 可以直接看到字符串:
Import["file","List"] | 将每一行分别作为数字或其他数据项 |
Import["file","Table"] | 将各行的每一个元素分别作为一个数字或其他数据项 |
Import["file","String"] | 将整个文件作为一个单独的字符串 |
Import["file","Text"] | 将整个文件作为一个文本字符串 |
Import["file",{"Text","Lines"}] | 将每一行作为一个文本字符串 |
Import["file",{"Text","Words"}] | 将每一个分离的词作为一个文本字符串 |
Export["name.ext",graphics] | 按从文件名得出的格式输出图形 |
Export["file",graphics,"format"] | 按指定格式输出声音 |
Export["!command",graphics,"format"] | 把图形输出到一个外部命令 |
Export["file",{g1,g2,…},…] | 为动画输出一系列图形 |
ExportString[graphics,"format"] | 产生一个所输出图形的字符串表达式 |
"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
)
|
ImageSize->x 使得图形的宽度为 x 个打印点,而 ImageSize->72xi 使宽度为 xi 英寸. 默认设置产生的图宽为4英寸. ImageSize->{x,y} 调节图形尺寸使其能放在 x×y 的区域内.
ImageSize | Automatic | 用打印点度量的图形绝对尺寸 |
"ImageTopOrientation" | Top | 是否旋转图形 |
ImageResolution | Automatic | 用 dpi 度量的图形分辨率 |
Export 选项.
许多程序和设备接收 Encapsulated PostScript (EPS)等与分辨率无关的格式的图形. 但一些需要将图形在指定的分辨率内转换为光栅或二进制映射. Export 的选项 ImageResolution 可以决定使用多少dpi分辨率. 这个值设置得越小,图形的质量就越差,所需的内存就越小. 屏幕显示时,典型的设置是72dpi或更大,打印时设置300dpi或更大.
Wolfram 语言提供了允许用户员实现文件格式转换的功能,该功能与 Wolfram 语言 Import 和 Export 框架相集成. 用户可以实现格式转换,并且使用 Import 从任意格式导入数据.
Wolfram 语言也提供了显示格式转换器如何实现与注册的开源代码. 这些代码位于文件夹 $InstallationDirectory/SystemFiles/Formats/format 中,其中 format 是下列格式之一: BDF、DIF、 MTP、SMILES、SurferGrid、TGF 或 TLE. 注册代码位于文件 Import.m 或者 Export.m 中,而转换器实现位于文件 Converter.m 中.
在 Import 和底层转化函数之间的界面由 RegisterImport 指定(在 ImportExport` 上下文下). 大体上,当导入一个文件格式的特定元素时,RegisterImport 告诉 Import 和 Export框架如何调用特定函数.
底层函数 将文件或者流视为输入,并且返回包含导入数据的规则列表. 这里有两种类型的底层函数:(1) 默认导入器,当导入未显式注册的元素时,框架对其进行调用;(2) 条件导入器,将一个在 RegisterImport 的第二个变量中注册的特定元素导入.
ImportExport`RegisterImport["format",{"elem1"conditionalFunction1,"elem2"conditionalFunction2,…,defaultFunction}] | 注册由 Import 框架所用的多个元素 (elem1,elem2,…) 和各自的转换器函数 (conditionalFunction1,conditionalFunction2,…). 另外当所要求的元素与任何已注册元素都不匹配时,也注册所用的 defaultFunction |
ImportExport`RegisterImport["format",{conditionalFuncs,defaultFunction},{"elem3"postFunction3,"elem4"postFunction4,…}] | 注册额外的转换器函数,这些函数的输入是其中一个底层函数的输出 |
默认导入器
新格式的注册和实现
默认情况下,该框架把文件名传递给底层函数,因此 MyFormat1`MyFormat1Import 将文件名和选项集作为输入. 该函数必须以 ElementName->ElementValue 形式返回规则列表.
导入具有新格式的文件
条件原始导入器
当一个格式包括多个元素时,利用特定的底层函数导入特定的元素可能是有用并且有效的. 这可以通过将形如 "elem"->func 的规则列表作为 RegisterImport 的第二个变量给出来实现. 但是,该列表必须以默认导入器名称结束,其中该导入器在导入不与列表中明确定义的元素匹配的元素时被调用.
具有条件导入器的新格式的注册与实现
本注册方法告诉 Import 和 Export 框架如何导入格式为 "MyFormat2" 的文件:
(1) 当导入 "Data" 元素时,使用 MyFormat2`MyFormat2DataImport;
(2) 对于所有其他元素,使用 MyFormat2`MyFormat2DefaultImport.
(1) 当导入 "Data" 元素时,使用 MyFormat2`MyFormat2DataImport;
(2) 对于所有其他元素,使用 MyFormat2`MyFormat2DefaultImport.
利用 MyFormat2 导入
指定子元素
默认情况下,该框架利用 Part 导入子元素.
对于包含一些大型数据集的文件,直接导入特定的数据集可能是有效的. 例如,我们可以直接从格式为 "EDF" 的文件中导入一个数据集.
后导入器
可能的情况是,我们必须基于其他元素构建元素. 例如,如果要导入的数据是表示灰度图像的数字列表,那么导入 "Image" 元素要求首先导入 "Data" 元素. 在本章节中,我们有两个使用"Graphics" 和 "Image" 元素的例子.
具有后导入器的新格式的注册与实现
为了说明条件导入器和后导入器的差异,我们使用两个额外的元素:"Graphics" 和 "Image" 来扩展 "MyFormat2". "Graphics" 元素通过一个条件导入器导入. 而 "Image" 元素由后导入器导入.
下面的注册方式告诉 Import 和 Export 框架如何导入格式为 "MyFormat3" 的文件:
(1) 对于 "Header" 或者 "Graphics" 元素,调用相应的条件导入器;
(2) 对于 "Image" 元素,首先调用默认的导入器,并且将其输出作为 MyFormat3`MyFormat3ImageImport 的输入;
(3) 对于所有其他元素,调用默认的导入器.
(1) 对于 "Header" 或者 "Graphics" 元素,调用相应的条件导入器;
(2) 对于 "Image" 元素,首先调用默认的导入器,并且将其输出作为 MyFormat3`MyFormat3ImageImport 的输入;
(3) 对于所有其他元素,调用默认的导入器.
利用 MyFormat3 导入
RegisterImport 的选项
"FunctionChannels" 和 "BinaryFormat"
在上述例子中,底层函数把文件名作为一个变量接受,并且该函数打开该文件的流. 通过把 "FunctionChannels"->{"Streams"} 指定为 RegisterImport 的一个选项,该框架可以直接把 InputStream 传递给底层函数.
通过设置选项 "BinaryFormat"->True,该框架把一个二进制流传递给底层导入器.
范例
"AvailableElements"
默认情况下,当导入一个未明确注册为条件导入器或后导入器的元素,该框架计算默认的导入器. 如果在默认的导入器中未找到匹配的元素,该框架产生一条错误信息,并且返回 $Failed.
通过设置选项 "AvailableElements"->{elem1,elem2,…},当我们试图导入一个不在指定列表中出现的元素时,该框架将直接返回 $Failed,并且产生一个错误信息而不调用任何底层导入器.
范例
ImportExport`RegisterImport["format",{"elem1":>eFunc1,"elem2":>eFunc2,eDefaultFunc},{},"AvailableElements"->{"elem1","elem2","Data"}]
注意,指定 "AvailableElements" -> {"elem1","Data"} 是错误的. 在这种情况下,Import[filename,{"format","elem2"}] 将返回 $Failed,因为 "elem2" 不位于由"AvailableElements" 指定的列表中.
"DefaultElement"
"Sources"
选项 "Sources"->{path1,path2,…} 可用来指定 .m、.mx 或者包含底层函数定义的 Wolfram Symbolic Transfer Protocol (WSTP) .exe 文件的文件路径. 该框架将自动使用适用于源文件的 Get 或者 Install.
Mathematica 提供了允许开发人员实现文件格式转换的功能,该功能与 Mathematica Import 和 Export 框架相集成. 用户可以实现格式转换,并且使用 Export 从自定义格式导出数据.
在 Export 和底层转换函数之间的界面由 RegisterExport 指定(在 ImportExport` 上下文下). 大体上,当把 Mathematica 表达式导出到一个文件格式时,RegisterExport 告诉 Import 和 Export 框架如何产生不同的函数调用.
Mathematica 也提供了不同转换器的源代码. 这些代码位于文件夹$InstallationDirectory/SystemFiles/Formats/format 中,其中 format 是其中之一:BDF、DIF、MTP、 SMILES、SurferGrid、TGF、或 TLE. 注册代码位于文件 Import.m 和/或 Export.m 中,而转换器源代码位于文件 Converter.m 中.
格式注册
编写转换函数
对于这个例子,考虑一个通过每个字符的 ASCII 码对一个 ASCII 字符串进行编码的文件,其中每个编码用单个空格分隔. 该格式的转换器函数可以使用 RegisterExport 添加到 Import 和 Export 框架中.
转换函数的元素和选项
自动与手动加载
手动加载
自动加载
1. 如果目录 $UserBaseDirectory/SystemFiles/Formats 不存在,则创建该目录.
2.在 $UserBaseDirectory/SystemFiles/Formats 下,创建一个名为 format 的目录,其中 format 为要自动加载的格式名称.
5. 有了这些文件,当 Wolfram 语言启动时,$ImportFormats 将包含 "MyFormat1" 一项,并且Import[ file,{"MyFormat1","Header"}] 将适当计算.
注册机制细节
目录名必须与格式名匹配
如果源文件不在标准位置,"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 实现.
Wolfram 系统笔记本提供了创建技术文档的高级环境. 但是,如果用户想要把已有材料以 Tex 格式结合到自己的工作中. 那么使用 TeXForm 把 Wolfram 语言表达式转换成适合 Tex 输入的格式是很方便的.
TeXForm[expr] | 以 Tex 输入格式打印 expr |
ToExpression["input",TeXForm] | 把 TeX 输入转换成 Wolfram 语言格式 |
Export["file.html",nb] | 以 HTML 形式保存笔记本 nb |
Export 有许多应用于 HTML 输出的选项,允许我们可以指定如何将笔记本转换为具有不同功能的网络浏览器.
MathMLForm[expr] | 以 MathML 形式打印 expr |
MathMLForm[StandardForm[expr]] | 使用 StandardForm 而不是传统的数学符号 |
ToExpression["string",MathMLForm] | 把一个 MathML 字符串解释为 Wolfram 语言输入 |
如果把 MathML 粘贴到一个 Wolfram 语言笔记本,Wolfram 语言将自动试图转换为 Wolfram 语言输入. 用户可以使用笔记本前端的 复制为 菜单从笔记本以 MathML 拷贝一个表达式.
Export["file.xml",expr] | 以 XML 格式导出 |
Import["file.xml"] | 从 XML 导入 |
ImportString["string","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 形式导入结果.