文件、流和外部操作
在外部文件中存储Wolfram语言表达式
您可以使用计算机系统上的文件存储Wolfram语言的定义和结果。最常见的方法是将所有内容存储为适合输入Wolfram语言的纯文本。使用这种方法,在一个计算机系统上运行的Wolfram语言版本生成的文件可以被任何计算机系统上的版本读取。此外,此类文件可以由其他标准程序操作,例如文本编辑器。
<<文件 或 获取["文件"] |
读入Wolfram语言输入文件,并返回文件中的最后一个表达式
|
文件打印["文件"] | 显示文件的内容 |
快递>>文件 或 放置[快递,"文件"] | 将表达式写入文件 |
快递>>>文件 或 PutAppend(放置追加)[快递,"文件"] | 将表达式附加到文件 |
这会扩大并将结果输出到名为临时管理计划: 以下是的内容临时管理计划。它们可以直接用作Wolfram语言的输入: 这可以读入临时管理计划,评估其包含的Wolfram语言输入: 如果Wolfram语言找不到您要求它读取的文件,它会打印一条消息,然后返回符号$失败: 当您使用<<文件,Wolfram语言返回它在文件中计算的最后一个表达式。通过以分号结尾文件中的最后一个表达式,或通过显式添加无效的在那个表达式之后。 如果Wolfram语言在读取文件时遇到语法错误,它会报告错误,跳过文件的其余部分,然后返回$失败。如果语法错误发生在使用BeginPackage(开始包)和其他上下文操作函数,然后Wolfram语言尝试将上下文恢复到读取包之前的状态。 保存多个Wolfram语言表达式
Wolfram语言输入文件可以包含任意数量的表达式。然而,每个表达式都必须从新行开始。表达式可以根据需要连续显示任意多行。就像在标准的交互式Wolfram语言会话中一样,表达式一完成就被处理。请注意,在文件中,与交互式会话不同,您可以在任意点插入空行而不产生任何效果。 当您使用快递>>>文件,Wolfram语言会将您给出的每个新表达式附加到文件末尾。如果您使用快递>>文件然而,Wolfram语言反而会删除文件中以前存在的任何内容,然后将快递到文件中。 如果你熟悉命令‐行操作系统,您将认识到Wolfram语言重定向操作符>>,>>>、和<<类似于命令‐线路操作员>,>>、和<. 以不同格式保存Wolfram语言表达式
当您使用其中之一时>>或>>>要将表达式写入文件,表达式通常以Wolfram Language输入格式给出,以便您可以将它们读回Wolfram语言。然而,有时您可能希望以其他格式保存表达式。可以通过显式包装格式指令来实现这一点,例如输出表单围绕着你写出的表达式。 保存Wolfram语言对象的定义
使用文件的最常见原因之一是保存Wolfram Language对象的定义,以便能够在随后的Wolfram语言会话中再次读取它们。操作员>>和>>>允许您将Wolfram语言表达式保存在文件中。您可以使用该功能保存以适合在后续Wolfram语言会话中执行的形式保存Wolfram Language对象的完整定义。
保存["文件",符号] | 将符号的完整定义保存在文件中 |
保存["文件","形式"] | 保存名称与字符串模式匹配的符号的定义形式 |
保存["文件","上下文`"] | 保存指定上下文中所有符号的定义 |
保存["文件",{对象1,对象2,…}] | 保存多个对象的定义 |
该文件不仅包含(f)本身,也是符号的定义一在其中(f)取决于: 功能保存利用输出表单定义和完整定义,打印为Wolfram语言符号的定义。在某些情况下,您可能会发现直接使用这些输出表单很方便。 当您在Wolfram语言中定义新对象时,您的定义通常取决于您之前定义的其他对象。如果您要在随后的Wolfram语言会话中重建新对象的定义,那么重要的是您不仅要存储其自身的定义,还要存储其所依赖的其他对象的定义。功能保存查看您要求它保存的对象的定义,并自动保存它可以看到这些对象所依赖的其他对象的所有定义。然而,为了避免节省大量不必要的材料,保存从不包含具有属性的符号的定义受保护的。它假设这些符号的定义也是内置的。然而,考虑到这些定义,应该始终是读取由保存回到新的Wolfram语言会话中,将完全按照之前的方式设置对象的定义。 以编码形式保存Wolfram语言定义
当您创建用于输入Wolfram语言的文件时,通常希望它们只包含“纯文本”,可以直接读取或修改。然而,有时您可能希望对文件的内容进行“编码”,以便它们不能作为纯文本直接读取或修改,而是可以加载到Wolfram语言中。您可以使用Wolfram Language函数创建编码文件编码.
编码["来源","目的地"] | 编写文件的编码版本来源到文件目的地 |
<<目的地 | 读取编码文件 |
编码["来源","目的地","钥匙"] | 用指定的密钥编码 |
获取["目的地","钥匙"] | 读入用密钥编码的文件 |
编码["来源","目的地",机器ID->“身份证件"] | 创建只能在具有特定ID的计算机上读取的编码文件 |
这将写入文件的编码版本临时管理计划到文件临时协议。x个: 以下是编码文件的内容。唯一可识别的部分是开头的Wolfram语言注释:
转储保存["文件.mx英寸,符号] | 以内部Wolfram语言格式保存符号的定义 |
转储保存["文件.mx英寸,"上下文`"] | 保存上下文中所有符号的定义 |
转储保存["文件.mx英寸,{对象1,对象2,…}] | 保存几个符号或上下文的定义 |
转储保存["包裹`",物体] | 使用特殊选择的名称将定义保存在文件中 |
如果您必须阅读非常大或复杂的定义,您通常会发现以内部Wolfram System格式存储这些定义比以文本形式存储更有效。您可以使用转储保存. 这将保存的定义(f)内部Wolfram System格式: <<识别文件何时包含内部Wolfram System格式的定义,并进行相应操作。一个微妙之处是,内部Wolfram System格式因计算机系统而异。因此,.mx(毫米)在一台计算机上创建的文件不能总是在另一台计算机中读取。 如果您使用转储保存["包裹`",…]然后,Wolfram语言将向一个名为包裹.mx毫米/系统/包裹.mx(毫米),其中系统标识您的计算机系统类型。 这将创建一个文件,其名称反映所用计算机系统的名称: 在大多数计算机系统上,您可以从Wolfram语言中执行外部程序或命令。通常,您会希望获取在Wolfram Language中生成的表达式,并将其发送到外部程序,或者从外部程序获取结果,然后将其读入Wolfram语言。 Wolfram语言支持与外部程序的两种基本通信形式:结构化的和非结构化的.
结构化通信 | 使用WSTP与WSTP交换表达式‐兼容的外部程序 |
非结构化通信 | 使用文件读写操作交换普通文本 |
结构化通信的思想是将完整的Wolfram语言表达式交换到专门设置用于处理此类对象的外部程序。结构化通信的基础是Wolfram符号传输协议(WSTP)系统,在“WSTP和外部程序通信”. 非结构化通信包括从外部程序发送和接收普通文本。其基本思想是将外部程序视为文件,并支持相同类型的读写操作。
<<文件 | 读入文件 |
<<"!命令" |
运行外部命令,并读入它产生的输出
|
快递>>"!命令" | 输入的文本形式快递到外部命令 |
阅读列表["!命令",编号] |
运行外部命令,读入它产生的数字列表
|
通常,无论您在哪里使用普通文件名,Wolfram语言都允许您提供管,写为外部命令,以感叹号开头。当您使用管道时,Wolfram语言将执行外部命令,并从中发送或接收文本。 这将从以下位置发送结果因子整数到外部程序液化石油气。在许多Unix系统上,此程序生成打印输出: 这将执行外部命令echo$TERM(回音$TERM),然后将结果读取为Wolfram Language输入: 带有文本‐基于接口,放置!在一行的开头,导致该行的其余部分作为外部命令执行。正方形是一个打印数字及其正方形的外部程序。
在[1]中:=!方块4
1 1
2 4个
3 9
4 16
这将运行外部命令方块4,然后从其生成的输出中读取数字: 需要注意的一点是,您可以在右侧的管道名称周围去掉双引号,这样就可以逃脱惩罚‐的手侧<<或>>如果名称不包含任何空格或其他特殊字符。 Wolfram语言中的管道为与外部程序进行非结构化通信提供了一种非常通用的机制。在许多计算机系统上,Wolfram语言管道是使用底层操作系统中的管道机制实现的;然而,在某些情况下,会使用其他进程间通信机制。Wolfram语言中非结构化通信的一个限制是,给定的管道只能用于输入或输出,不能同时用于两者。为了做真正的二人组‐通过通信,您需要使用WSTP。 即使使用非结构化通信,您也可以通过使用“临时文件”来设置一些更复杂的安排。基本思想是将数据写入文件,然后根据需要进行读取。 特别是当您使用临时文件时,您可能会发现能够执行外部命令非常有用,这些命令不会显式地发送或接收来自Wolfram语言的数据。您可以使用Wolfram Language函数执行此操作运行.
运行["命令",参数1,…] | 从Wolfram语言内部运行外部命令 |
这将执行外部Unix命令日期。返回的值是操作系统的“退出代码”: 请注意,当您使用运行,不得在命令前加惊叹号。运行只需采用您指定的参数的文本形式,然后用空格将它们连接在一起,并将结果字符串作为外部shell命令执行。 重要的是要认识到运行从不“捕获”来自外部命令的任何输出。因此,此输出的去向完全由操作系统决定。类似地,运行不向外部命令提供输入。这意味着这些命令可以通过操作系统提供的任何机制获得输入。有时,外部命令可以访问Wolfram语言本身使用的相同输入和输出流。在某些情况下,这可能是您想要的。但是,特别是如果您使用带有前端的Wolfram语言,这可能会带来相当大的麻烦。 如上所述,<<和>>不能用于同时从外部程序发送和接收数据。然而,通过使用临时文件,您可以有效地从外部程序发送和接收数据,同时仍然使用非结构化通信。 功能贯穿(RunThrough)将表达式的文本写入临时文件,然后将此文件作为输入提供给外部程序,并将输出捕获为Wolfram语言的输入。请注意,在贯穿(RunThrough),喜欢运行,不应在外部命令的名称前面加上感叹号。 这为表达式提供了内容789到外部程序猫,在本例中,它只是回显表达式的文本。来自的输出猫然后读回Wolfram语言:
系统打开["目标"] |
打开指定的文件,计算机系统上具有关联程序的URL或其他目标
|
系统打开使用操作系统中的设置来确定如何打开URI或文件。打开文件时,它通常使用与双击文件图标时相同的程序。 文件和管道都是通用Wolfram System对象的示例,称为溪流Wolfram系统中的流是输入或输出源。您可以对流执行许多操作。 你可以想想>>和<<作为“高”‐电平“Wolfram系统输入‐输出函数。它们基于一组较低的‐电平输入‐直接处理流的输出原语。通过使用这些原语,您可以更好地控制Wolfram系统的输入和输出方式。例如,如果您编写Wolfram System程序来存储和检索文件或管道中的中间数据,则通常需要这样做。 基本低点‐将输出写入Wolfram系统中的流的级别方案如下。首先,你打电话打开写入或打开附加“打开流”,告诉Wolfram系统您想将输出写入特定文件或外部程序,以及应该以何种形式写入输出。打开流后,您可以调用写入或写入字符串将表达式或字符串序列写入流。当你完成后,你打电话关闭“关闭流”。 当您打开文件或管道时,Wolfram系统会创建一个“流对象”,指定与文件或管道关联的开放流。通常,流对象包含文件名或管道中使用的外部命令,以及唯一的编号。 流对象需要包含唯一编号的原因是,通常可以同时将多个流连接到同一文件或外部程序。例如,您可以启动同一外部程序的多个不同实例,每个实例连接到不同的流。 然而,当您打开一个流时,只要只有一个流与该对象关联,您仍然可以使用简单的文件名或外部命令名来引用它。 因为您只有一个与文件关联的流临时管理计划,只需指定文件名即可引用:
OpenWrite(打开写入)["文件"] |
将输出流打开到文件,清除文件的先前内容
|
OpenWrite(打开写入)[] | 打开新临时文件的输出流 |
打开附加["文件"] |
打开文件的输出流,附加到文件中已有的内容
|
OpenWrite(打开写入)["!命令"] | 打开外部命令的输出流 |
写入[流动,快递1,快递2,…] |
将表达式序列写入流,用换行符结束输出(线路馈线)
|
写入字符串[流动,字符串1,字符串2,…] |
将字符串序列写入流,没有额外的换行符
|
关闭[流动] | 告诉Wolfram系统你已经完成了一条流 |
当你打电话时写入[流动,快递],它将表达式写入指定的流。默认情况下,将表达式写入Wolfram System输入表单写入通过一系列表达式,它将一个接一个地将这些表达式写入流。通常,它在连续表达式之间不留空格。然而,当它写完所有的表达式后,写入总是以换行符结束其输出。 所有的表达式都是以输入形式编写的写入放在同一条线上: 写入提供了一种写出完整的Wolfram语言表达式的方法。然而,有时您可能希望写出结构较低的数据。写入字符串允许您写出任何字符串。与写入,写入字符串不添加换行符或其他字符。 这是文件的内容。字符串完全按照规定写入,只包括显式给定的换行符:
写入[{流动1,流动2},快递1,…] | 将表达式写入流列表 |
写入字符串[{流动1,流动2},字符串1,…] | 将字符串写入流列表 |
功能的一个重要特征写入和写入字符串它们不仅允许您将输出写入单个流,还可以写入流列表。 在使用Wolfram系统时,通常可以方便地定义通道其由流的列表组成。然后,您可以简单地告诉Wolfram系统写入通道,并让它自动将同一对象写入多个流。 在标准交互式Wolfram系统会话中,通常定义了几个输出通道。它们指定了应将特定类型的输出发送到何处。因此,例如,$输出指定标准输出的位置,而$条消息指定消息应该放在哪里。功能打印然后基本上通过调用写入使用$输出频道。消息通过调用以相同的方式工作写入使用$条消息频道。“主回路”列出了典型Wolfram系统会话中使用的通道。 请注意,当您通过Wolfram符号传输协议(WSTP)运行Wolfram系统时,通常会使用不同的方法。所有输出通常都写入单个WSTP链路,但每一条输出都显示在一个“数据包”中,该数据包指示其类型。 在大多数情况下,您在Wolfram系统中使用的文件或外部命令的名称与您的计算机使用的名称完全对应’的操作系统。然而,在某些系统上,Wolfram系统支持具有特殊名称的各种流。 特殊的流“标准输出”允许您向操作系统提供的“标准输出”提供输出。但是请注意,您只能将此流用于简单文本‐基于Wolfram系统接口。如果您与Wolfram系统的交互更加复杂,那么此流将无法工作,并且尝试使用它可能会导致相当大的麻烦。 您可以将许多选项与输出流相关联。您可以在首次使用打开流时指定这些选项OpenWrite(打开写入)或打开附加. 这将打开一个流,指定使用的默认输出格式应为输出表单: 请注意,您可以通过使用显式Wolfram System格式指令包装写入流的特定表达式来覆盖为特定流指定的输出格式,例如输出表单或TeX表格. 选项页面宽度给出了可用于Wolfram系统文本输出的页面宽度。所有输出行都被打断,以便它们适合此宽度。如果不希望任何线条被打断,可以设置页面宽度->无穷。但是,通常您需要设置页面宽度设置为适用于特定输出设备的值。在许多系统上,您必须运行一个外部程序来确定此值设置选项,您可以为设置默认规则页面宽度例如,页面宽度:><<“!设备宽度”,以便自动运行外部程序以查找选项的值。 写出的表达式中的所有行都是断开的,因此最长不超过20个字符: 选项字符编码允许您指定将用于发送到特定输出流的所有字符串的字符编码,无论写入或写入字符串。您通常需要使用字符编码如果要修改国际字符集,或阻止特定输出设备接收它无法处理的字符。
选项[流动] | 查找为流设置的选项 |
设置选项[流动,选择1->val值1,…] | 重置开放流的选项 |
在会话的每一点,Wolfram系统都会维护一个列表流[]当前打开的所有输入和输出流及其选项。在某些情况下,您可能会发现直接查看此列表很有用。然而,Wolfram系统不允许您修改列表,除非通过开放阅读等等。 目录操作
文件命名的精确细节因计算机系统而异。尽管如此,Wolfram系统提供了一些适用于所有系统的相当通用的机制。 Wolfram系统假设您的所有文件都按以下层次结构排列目录。要查找特定文件,Wolfram系统必须知道文件的名称以及它所在的目录序列。 然而,在任何给定的时间,您都有一个当前工作目录,您可以通过指定文件或其他目录相对于此目录的位置来引用它们。通常,您可以引用实际在里面这个目录只需给出它们的名称,没有目录信息。 当你打电话时设置目录,您可以指定操作系统可以识别的任何目录名。例如,在Unix上‐基于系统,您可以使用符号在目录层次结构的上一级指定目录..,您可以将“home”目录指定为~. 每当使用转到新目录时设置目录,Wolfram语言总是记住上一个目录是什么。您可以使用返回到上一个目录重置目录通常,Wolfram语言维护一个目录堆栈,由目录堆栈[]。每次你打电话设置目录,它将向堆栈中添加一个新目录,每次调用重置目录它从堆栈中删除一个目录。 查找文件
每当你要求一个特定的文件时,Wolfram语言通常会经过几个步骤来尝试找到你想要的文件。第一步是使用操作系统或shell中存在的任何标准机制。 Wolfram语言扫描您为文件指定的全名,并查看它是否包含任何“元字符”*,$,~,?,[,",∖、和'。如果找到此类字符,则将全名传递给操作系统或shell进行解释。这意味着如果您使用Unix‐基于系统,然后构造为名称*和$VAR(无功功率)此时将展开。但一般来说,Wolfram语言接受操作系统或shell返回的任何内容,并将其视为完整的文件名。 对于输出文件,这是Wolfram语言处理的结束。如果Wolfram语言找不到具有指定名称的唯一文件,那么它将继续创建该文件。 然而,如果您试图从文件中获取输入,那么Wolfram语言会进行另一轮处理。所发生的事情是Wolfram语言查看路径选项,该选项用于确定要搜索文件的目录的相对名称。默认设置路径选项是全局变量$路径.
获取["文件",路径->{"目录1","目录2",…}] |
获取文件,相对于目录搜索它
目录我
|
$路径 | 要搜索输入文件的相对目录的默认列表 |
通常,全局变量$路径定义为字符串列表,每个字符串代表一个目录。每次您请求输入文件时,Wolfram语言有效地做的是临时将这些目录中的每一个依次设置为您当前的工作目录,然后从该目录中尝试找到您请求的文件。 以下是的典型设置$路径。当前目录(.)和您的主目录(~)首先列出: 查找文件搜索中的所有目录$路径并返回将由加载的文件的绝对名称获取,需要和其他功能。文件存在Q测试具有给定名称的文件是否存在。 查找文件应用于包名称将返回该包中init.m文件的绝对名称。 目录列表内容
文件名[] | 列出当前工作目录中的所有文件 |
文件名["形式"] | 列出当前工作目录中名称与字符串模式匹配的所有文件形式 |
文件名[{"形式1","形式2",…}] | 列出名称与任何形式我 |
文件名[形式,{"目录1","目录2",…}] | 给出名称匹配的所有文件的全名形式在任何目录中目录我 |
文件名[形式,目录,n个] | 包含子目录中最多n个水平下降 |
文件名[形式,目录,无穷] | 在所有子目录中包含文件 |
文件名[形式,$路径,无穷] | 提供名称匹配的所有文件形式在中目录的任何子目录中$路径 |
文件名返回与文件名对应的字符串列表。当它返回一个不在当前目录中的文件时,它会给出相对于当前目录的文件名。请注意,所有名称均以适合生成它们的特定计算机系统的格式给出。 以下是当前工作目录中名称以结尾的所有文件的列表.米: 此列表列出名称以开头的文件一在当前目录中,以及名称以开头的子目录中P(P): 您给的文件名表单文件名可以使用Wolfram语言的任何字符串模式对象,通常与~~操作员。 这会列出当前工作目录中名称与表单匹配的所有文件测试*。米: 这仅列出具有表单名称的文件测试d日.米,其中d日是一个或多个数字的序列: 组成文件名
目录名称["文件"] | 从文件名中提取目录名 |
文件名联接[{"目录","名称"}] | 根据目录名和文件名组合完整的文件名 |
家长目录["目录"] | 给出目录的父目录 |
文件名联接[{"目录1","目录2",…,"名称"}] | 从目录名的层次结构中组合完整的文件名 |
文件名联接[{"目录1","目录2",…}] | 从目录名的层次结构中组合单个目录名 |
你应该意识到不同的计算机系统可能会以不同的方式提供文件名。因此,例如,Windows系统通常以以下形式命名目录:∖目录∖目录∖名称Unix系统以以下形式给出名称目录/目录/名称.功能文件名联接以适合您使用的特定计算机系统的方式汇编文件名。 功能如文件名拆分和文件名联接提供有关文件名的其他操作。它们尊重操作系统使用的文件名分隔符,并将适当地拆分文件名。文件名联接默认情况下将使用$Pathname分隔符以适合您的操作系统的规范形式生成名称。 如果要设置相关文件的集合,则在读取另一个文件时能够引用一个文件通常很方便。全局变量$InputFileName(输入文件名)提供当前从中获取输入的文件的名称。使用目录名称和文件名联接然后可以方便地指定其他相关文件的名称。 了解如何引用Wolfram语言当前正在读取的文件。 用Wolfram语言处理文件的一个问题是,文件和目录名称的形式因计算机系统而异。这意味着,例如,包含标准Wolfram语言包的文件的名称在不同的系统上可能会有很大的不同。然而,通过一系列约定,可以在所有系统上使用相同的命令读取标准Wolfram语言包。其工作方式是每个包定义一个so‐称为Wolfram语言上下文,形式为名称`名称`。在每个系统上,所有文件的命名都与它们定义的上下文相对应。然后,当您使用命令时<<名称`名称`,Wolfram语言会自动将上下文名称转换为适合您特定计算机系统的文件名。 标准文件扩展名
文件.米 | 纯文本格式的Wolfram语言表达式文件 |
文件.编号 | Wolfram System笔记本文件 |
文件.mx(百万倍) | |
如果您使用Wolfram System的笔记本界面,那么Wolfram系统前端允许您保存完整的笔记本,不仅包括Wolfram Language输入和输出,还包括文本、图形和其他材料。 通常情况下,Wolfram System笔记本文件的名称以.nb结尾,大多数版本的Wolfram System都强制执行此约定。 你可以使用文件基本名称和文件扩展名提取文件名及其扩展名。 当您在Wolfram System前端打开笔记本时,Wolfram系统将立即显示笔记本的内容,但通常不会将这些内容发送到内核进行评估,直到您明确要求这样做。 然而,在Wolfram System笔记本电脑中,您可以使用前端的菜单将某些单元格标识为初始化单元格,如果这样做,则每次打开笔记本时,都会自动评估这些单元格的内容。 这个我单元格括号中的表示第二个单元格是初始化单元格,每次打开笔记本时都会对其进行求值。
有时,在包含解释性文本的笔记本和仅包含原始Wolfram语言定义的包中维护Wolfram系统材料是很方便的。您可以通过将Wolfram语言定义放入笔记本中的初始化单元格来实现这一点。每次保存笔记本时,前端都会允许您保存一个关联的.m文件,该文件只包含原始的Wolfram语言定义。 不同的操作系统有不同的命令来操作文件。Wolfram语言提供了一组简单的文件操作函数,旨在以相同的方式在所有操作系统中工作。 请注意复制文件和重命名文件给最终文件与原始文件相同的修改日期。文件日期返回中的修改日期{年,月,白天,小时,分钟,第二}使用的格式日期列表. 使用<<,您可以读取包含输入形式中给定的Wolfram语言表达式的文件。然而,有时您可能需要读取数据其他格式。例如,您可能有一个由空格分隔的数字序列组成的外部程序生成的数据。此数据不能作为Wolfram语言输入直接读取。然而,函数阅读列表可以从文件或输入流中获取此类数据,并将其转换为Wolfram语言列表。
阅读列表["文件",编号] |
从文件中读取数字序列,并将其放入Wolfram语言列表
|
这会将文件中的每一对连续数字放入一个单独的列表中: 阅读列表可以处理Fortran中给定的数字‐比如“E类“符号。例如,阅读列表将读取2.5E类+5作为。请注意阅读列表可以处理精度为任意位数的数字。 这是一个包含Fortran中数字的文件‐比如“E类“注释:
阅读列表["文件",类型] | 读取特定类型的对象序列 |
阅读列表["文件",类型,n个] | 最多只能阅读n个物体 |
阅读列表不仅可以读取数字,还可以读取各种其他类型的对象。每种类型的对象都由一个符号指定,例如编号. 这将生成文件中的字符列表,每个字符都作为一个字符给出‐字符串:
字节 |
单字节数据,作为整数返回
|
字符 | 单个字符,作为一个返回‐字符串 |
真实 | Fortran中的近似数‐类似符号 |
编号 | Fortran中的精确数或近似数‐类似符号 |
单词 | 由单词分隔符分隔的字符序列 |
记录 | 由记录分隔符分隔的字符序列 |
字符串 | 字符串以换行符结尾 |
表达式 | 完整的Wolfram语言表达式 |
保持[表达式] | |
阅读列表允许您从文件中读取“单词”。它认为“单词”是由单词分隔符分隔的任何字符序列。您可以设置选项单词分隔符指定要作为单词分隔符的字符串。默认设置是包括空格和制表符,但不包括标准标点符号等。请注意,在所有情况下,连续单词都可以用任意数量的单词分隔符分隔。这些分隔符永远不会被视为阅读列表. 这将读取文件中的文本串作为一系列单词,使用字母e(电子)和.作为单词分隔符: Wolfram语言认为任何数据文件都由以下序列组成记录。默认情况下,每一行都被视为一个单独的记录。通常,您可以设置选项记录分隔符为记录提供分隔符列表。请注意,单词永远不能跨越记录分隔符。与单词分隔符一样,连续记录之间可以存在任意数量的记录分隔符,这些分隔符不被视为记录本身的一部分。 这将读取文件中的所有文本来源并将其作为单个字符串返回: Wolfram语言通常允许在连续记录或单词之间出现任意数量的适当分隔符。然而,有时当存在多个分隔符时,您可能希望假定在每对相邻分隔符之间出现“空记录”或“空单词”。您可以通过设置选项来完成此操作Null记录->真的或空字->真的. 在大多数情况下,您希望用分隔符分隔单词,这些分隔符本身并不被视为单词。然而,有时允许用特殊的“标记词”分隔单词是很方便的,它们本身就是单词。您可以提供此类标记词的列表作为选项的设置标记词. 这将读取文本,使用指定的标记词来分隔文本中的单词: 你可以使用阅读列表从文件中读取Wolfram语言表达式。通常,每个表达式都必须以换行结束,尽管一个表达式可能会持续几行。 下面是一个包含可用作Wolfram语言输入的文本的文件: 这样可以读入文本快递作为Wolfram语言表达式: 阅读列表可以将它读取的对象插入到任何Wolfram语言表达式中。的第二个参数阅读列表可以由包含以下符号的任何表达式组成编号和单词指定要读取的对象。因此,例如,阅读列表["文件",{编号,编号}]将它读取的连续数字对插入到列表中。类似地,阅读列表["文件",保持[表达式]]将读取的表达式放入保持. 如果阅读列表在文件读完所需的一组特定对象之前到达文件末尾,然后插入特殊符号EndOfFile(结束文件)代替它尚未读取的对象。
阅读列表["!命令",类型] |
执行命令,并读取其输出
|
阅读列表[流动,类型] | 读取任何输入流 |
这将执行Unix命令日期,并将其输出读取为字符串:
开放阅读["文件"] | 打开文件进行读取 |
开放阅读["!命令"] | 打开管道阅读 |
阅读[流动,类型] | 从流中读取指定类型的对象 |
跳过[流动,类型] | 跳过输入流中指定类型的对象 |
跳过[流动,类型,n个] | 跳过n个输入流中指定类型的对象 |
关闭[流动] | 关闭输入流 |
阅读列表允许您阅读全部的特定文件或输入流中的数据。然而,有时您希望一次获取一块数据,可能需要进行测试,以确定下一步需要什么样的数据。 当您从文件中读取单个数据片段时,Wolfram语言总是记住您在文件中的“当前点”。当你打电话时开放阅读,Wolfram语言从文件中设置输入流,并使当前点成为文件的开头。每次使用从文件中读取对象时阅读,Wolfram语言将您当前的点设置为刚好在您阅读的对象之后。使用跳过,您可以将当前点向前移动,使其越过一系列对象,而无需实际读取这些对象。 您可以使用这些选项单词分隔符和记录分隔符在里面阅读和跳过就像你在阅读列表. 请注意,如果您试图读取超过文件末尾的内容,阅读返回符号EndOfFile(结束文件).
查找列表["文件","文本"] | 获取文件中包含指定文本的所有行的列表 |
查找列表["文件","文本",n个] | 获取第一个列表n个包含指定文本的行 |
查找列表["文件",{"文本1","文本2",…}] | 获取包含任何文本我 |
默认情况下,查找列表扫描文件的连续行,并返回包含指定文本的行。然而,一般来说,您可以查找列表连续扫描记录,并返回包含指定文本的完整记录。如中所示阅读列表,选项记录分隔符允许您告诉Wolfram语言要考虑哪些字符串作为记录分隔符。请注意,通过提供一对列表作为录音分离器,可以指定不同的左分隔符和右分隔符。通过这样做,你可以查找列表只搜索特定分隔符对之间的文本。 一般来说,查找列表查找出现在记录内任意位置的文本。通过设置选项单词搜索->真的然而,你可以看出查找列表要求它要查找的文本显示为单独的单词记录中。选项单词分隔符指定单词的分隔符列表。 文本第个不会显示在文件中,但不会显示为单词。因此查找列表失败:
查找列表[{"文件1","文件2",…},"文本"] | 在任何文件我 |
打电话通常很有用查找列表在由以下函数生成的文件列表中文件名.
查找列表["!命令",…] |
运行外部命令,并在其输出中查找文本
|
开放阅读["文件"] | 打开文件进行读取 |
开放阅读["!命令"] | 打开管道阅读 |
查找[流动,文本] | 查找下一次出现的文本 |
关闭[流动] | 关闭输入流 |
查找列表通过在特定文件中进行一次传递来查找指定文本的出现次数。然而,有时您可能希望逐步搜索连续出现的文本。您可以使用查找. 为了使用查找,首先必须使用开放阅读然后,每次你打电话查找在这个流中,它将搜索您指定的文本,并使文件中的当前点正好位于它找到的记录之后。因此,您可以致电查找多次查找连续的文本。 一旦有了输入流,就可以混合调用查找,跳过、和阅读.如果你打过电话查找列表或阅读列表,Wolfram语言将立即读取到输入流的末尾。 这将查找包含以下内容的第一行第二,并将文件中的当前点保留在下一行的开头: 功能如阅读,跳过、和查找通常以完全连续的方式对流进行操作。每次调用其中一个函数时,流中的当前点都会继续移动。 有时,您可能需要知道流中当前点的位置,并能够重置它。在大多数计算机系统上,流位置以整数形式返回当前点的位置,给出从流开始的字节数。 第一次打开文件时,当前点位于开头,并且流位置收益0: 功能如阅读和查找最常用于处理来自外部文件的文本和数据。然而,在某些情况下,您可能会发现在Wolfram语言中使用这些相同的函数来处理字符串很方便。您可以使用函数来完成此操作字符串到流,它打开一个输入流,该输入流不从外部文件获取字符,而是从Wolfram语言字符串获取字符。 与字符串关联的输入流的工作方式与文件的工作方式相同。在任何给定的时间,流中都有一个当前位置,当您使用以下函数时,该位置会前进阅读。当前位置由函数指定为字符串开头的字符数流位置[流动]。可以使用显式设置当前位置设置流位置[流动,n个]. 如果现在从字符串中读取一个数字,则会得到23的一部分123: 特别是在处理大量文本数据时,通常会将相当长的字符串读入Wolfram语言,然后使用字符串到流以允许在Wolfram语言中对这些字符串进行进一步处理。使用创建输入流后字符串到流,您可以使用针对文件讨论的任何函数来读取和搜索字符串。 这将查找第一次出现的这个在字符串中,并将当前点保留在其后面: 功能如阅读和写入处理普通的可打印文本。但在处理外部数据文件或设备时,有时需要转到较低级别,直接处理原始二进制数据。您可以使用二进制读取和二进制写入.
二进制读取[流动] | 读取一个字节 |
二进制读取[流动,类型] | 读取指定类型的对象 |
二进制读取[流动,{类型1,类型2,…}] | 读取对象列表 |
二进制写入[流动,b条] | 写入一个字节 |
二进制写入[流动,{b条1,b条2,…}] | 写入字节序列 |
二进制写入[流动,"一串"] | 把字符写在字符串中 |
二进制写入[流动,x个,类型] | 写入指定类型的对象 |
二进制写入[流动,{x个1,x个2,…},类型] | 写一系列对象 |
二进制写入[流动,{x个1,x个2,…},{类型1,类型2,…}] |
| 写入不同类型的对象 |
“字节” | 8‐位无符号整数 |
“特征8” | 8‐位字符 |
“角色16” | 16‐位字符 |
“复杂64” | IEEE单个‐精密复数 |
“复杂128” | IEEE双‐精密复数 |
“复杂256” | IEEE四线组‐精密复数 |
“整数8” | 8‐位带符号整数 |
“整数16” | 16‐位有符号整数 |
“整数32” | 32‐位带符号整数 |
“整数64” | 64‐位带符号整数 |
“整数128” | 128‐位带符号整数 |
“实际32” | IEEE单个‐精确实数 |
“Real64” | IEEE双‐精确实数 |
“实际128” | IEEE四线组‐精确实数 |
“TerminatedString” | 无效的‐终止字符串8‐位字符 |
“无符号整数8” | 8‐位无符号整数 |
“无符号整数16” | 16‐位无符号整数 |
“未签名的整数32” | 32‐位无符号整数 |
“无符号整数64” | 64‐位无符号整数 |
“无符号整数128” | 128‐位无符号整数 |
喜欢阅读和写入,二进制读取和二进制写入使用流。但如果您指定了文件名,它们会自动将指定的文件作为流打开。要直接创建流,可以使用开放阅读或OpenWrite(打开写入)。在某些计算机系统上,选项设置二进制格式->真的任何要与一起使用的流都需要二进制读取和二进制写入,以防止换行符翻译等问题可能导致的损坏。 在使用Wolfram语言时,您通常与计算机中数据的原始表示完全隔离。但是有二进制读取和二进制写入现在已经不是这样了。然后出现的一个微妙之处是,不同的计算机可能会将组成数字的字节按不同的顺序排列,这是由它们的设置指定的$字节排序. 二进制读取和二进制写入允许完全灵活地读取和写入原始二进制数据。但在许多实际应用程序中,人们只想使用特定的预定义格式。您可以使用导入和导出. 除了许多复杂的格式外,导入和导出包含相同数据元素序列的支持文件,其类型与中的相同二进制读取和二进制写入。他们还支持“比特”格式,由单个二进制位组成,表示为0或1. 如果你有特别的‐如果程序是用C或Fortran编写的,则可能需要将用Wolfram语言生成的公式插入到程序的源代码中。Wolfram语言允许您将数学表达式转换为C和Fortran表达式。 下面是一个用标准Wolfram语言形式写出的表达式: 下面是C形式的相同表达式电源在Wolfram语言大多数版本附带的C头文件mdefs.h中定义: 这里,整个C函数是从Wolfram语言计算出来的编译的函数表达式: 将Wolfram语言表达式转换为C或Fortran的一个常见动机是尝试使其在数值计算上更快。但C和Fortran可能比Wolfram语言更高效的一个最重要的原因是,在这些语言中,用户总是预先指定每个变量的类型—整数、实数、数组等。 Wolfram Language函数编译在Wolfram语言中进行这样的假设,并生成高效的内部代码。通过设置Compilation目标到“C”.
编译[x个,快递] | 将表达式编译为有效的内部代码 |
编译[x个,快递,编译目标->“C”] | 编译成C代码并链接回Wolfram语言 |
脚本文件
Wolfram Language脚本只是一个包含Wolfram语言命令的文件,您通常会在Wolfram Language会话中按顺序进行评估。如果需要多次重复命令,编写脚本非常有用。将这些命令收集在一起可以确保按照特定的顺序对它们进行求值,而不会遗漏任何命令。如果您运行复杂而冗长的计算,这一点很重要。 当您交互使用Wolfram语言时,可以使用获取。此函数也可以在代码或其他代码中以编程方式使用.wl码文件夹。
获取["文件"] | 读取文件并计算其中的命令 |
<<文件 | |
没有关于脚本文件结构的要求。文件中给出的任何Wolfram语言命令序列都将按顺序读取和评估。如果您的代码比普通的命令列表更复杂,您可能需要考虑编写一个更结构化的包,如中所述“设置Wolfram语言包”. 当不需要交互式会话时,Wolfram语言脚本更有用;也就是说,当脚本封装了需要执行的单个计算时—例如,如果计算涉及繁重的计算任务,例如线性代数、优化、数值积分或微分方程的求解,并且不使用排版、动态交互或笔记本。 脚本可以存储在普通.wl码包文件或专用.wls文件脚本文件。这两个文件的内容是相同的:一系列Wolfram语言表达式,开头有一个可选的“shebang”行,用于类Unix操作系统(请参阅Unix脚本可执行文件). 文件类型之间的唯一区别是它们的双击行为。双击程序包文件将在笔记本程序包编辑器中打开该文件,而双击脚本文件将在操作系统支持时执行该文件。这在Windows上尤其有利,因为在Windows上,无法将程序与特定文件关联,只能将文件扩展名关联。脚本文件可以在笔记本界面中编辑,但必须使用打开. 在本地内核中运行脚本
当从命令行调用Wolfram语言内核时,可以使用脚本文件,使用内核可执行文件的以下典型位置。
$“%ProgramFiles%\Wolfram Research\Mematica\{First[{}]}\Wolfram”-脚本文件.wl
$/Applications/Mathematica.app/Contents/MacOS/wolfram-脚本文件.wl
这个-脚本命令行选项指定Wolfram语言内核将以特殊脚本或批处理模式运行。在这种模式下,内核读取指定的文件并按顺序计算其命令。内核通过设置页面宽度输出函数的选项无穷并且没有打印在[]和输出[]标签。在该模式下运行时,标准输入和输出通道,、和不重定向,数字格式为输入表单. 正在运行钨矿使用-脚本选项相当于使用获取命令,只有一个区别:在计算完文件中的最后一个命令后,内核终止。此行为可能会影响通过运行脚本创建的Wolfram符号传输协议(WSTP)连接或外部进程。 使用WolframScript运行脚本
也可以使用WolframScript脚本解释如下。这个-文件标志是可选的。 WolframScript脚本将找到能够运行脚本的最佳本地内核。如果找不到任何本地内核,它将连接到云并在那里运行脚本。程序接受各种标志,以控制使用哪个本地内核或云内核进行评估。它还设置脚本参数,它允许脚本根据其启动方式或中接收的输入更改其行为。使用的另一个优点WolframScript脚本输入和输出是完全缓冲的,允许对其应用各种转换。所有这些附加选项都与WolframScript脚本第页。 在Windows和Linux上,WolframScript脚本通常与Wolfram系统一起安装。在Mac上,需要运行与Wolfram System捆绑的“Extras”安装程序,以便获得WolframScript脚本。这些安装程序将钨脚本默认情况下在PATH上。 Unix脚本可执行文件
类Unix操作系统—以及用于Windows的Unix环境,如cygwin和MinGW—允许编写可以作为常规可执行程序运行的可执行脚本。这是通过在文件的开头放置一个“解释器”行来完成的。对于包含Wolfram Language命令的脚本也可以这样做。 “解释器”行由两个字符组成,#!,必须是文件中的前两个字符,后跟可执行文件的绝对路径,然后是其他参数。为了实现跨平台和机器的最大兼容性,建议WolframScript脚本通过助手启动/usr/bin/env如下所示。这个环境价值程序将找到钨脚本然后正确启动它。
#!/usr/bin/env-wolframscript
(*生成混合分布的高精度样本*)
打印/@RandomVariate[MixtureDistribution[
{1,2},
{正态分布[1,2/10],
正态分布[3,1/10]}],
10,工作精度->50]
要使脚本可执行,您需要设置可执行权限。之后,只需在shell提示符下键入其名称即可运行脚本。
$chmod a+x脚本.wls
$ ./脚本.wls
解释器行还可能包含解释器的其他参数。可能的参数在WolframScript脚本第页。
#!/usr/bin/env wolframscript-linewise-格式XML
Wolfram语言脚本不需要.wl码或.wls文件扩展名。可执行脚本是一个功能齐全的程序,相当于Unix操作系统中的任何其他程序,因此可以在其他脚本、管道中使用,受作业控制等。每个Wolfram语言脚本都会启动自己的WolframKernel公司,它不共享变量或定义。请注意,并发运行Wolfram语言脚本可能会受到同时运行内核数量的许可限制的影响。 可执行脚本文件可以在交互式Wolfram语言会话中透明地读取和评估。这个获取如果脚本以#!字符。 可以避免使用环境价值程序,然后是指向钨脚本必须是绝对路径。用于启动脚本的操作系统机制不使用PATH或其他方式查找文件。此外,解释器的路径可能不包含空格。 Windows上的脚本
独立脚本也可以在Windows上使用。与类Unix操作系统不同,这些脚本必须具有扩展名.wls文件被识别为Wolfram语言脚本。它们可以通过双击Windows资源管理器启动,也可以通过键入名称从命令提示符启动。Unix解释器行(如果存在)被此机制忽略。 在命令提示符中,可以在文件名后传递其他参数。这些参数未被WolframScript脚本而是作为参数传递给脚本,如下一节所述。 脚本参数
当运行Wolfram语言脚本时,您可能经常希望通过在命令行上指定参数来修改脚本的行为。Wolfram语言代码可以通过$ScriptCommandLine此外,标准输入的内容可以作为变量中的字符串进行处理$ScriptInputString.
#!/usr/bin/env-wolframscript
(*生成混合分布的“num”样本*)
num=ToExpression[$ScriptCommandLine[2]]];
打印/@RandomVariate[
混合物分布[
{1、2},
{正态分布[1,0.2],
正态分布[3,0.1]}
],num,工作精度->50]
在脚本中访问时$ScriptCommandLine是一个列表,包含作为第一个元素的脚本名称和其余命令行参数。$ScriptCommandLine遵循标准argv[]惯例。请注意,这完全隐藏了解释器的路径或在#!行。 由于类Unix操作系统执行脚本的方式$ScriptCommandLine仅当通过调用Wolfram语言内核时才设置为非空列表钨脚本。如果脚本既要在批处理模式下运行,也要作为独立的Unix脚本运行,则可以通过评估$ScriptCommandLine==={}。然后,要么$ScriptCommandLine或$命令行应该用于访问命令行参数。