使用 Lua 处理文件中的数据

了解 Lua 如何处理数据的读取和写入。
64 位读者喜欢这篇文章。
Person standing in front of a giant computer screen with numbers, data

Opensource.com

有些数据是短暂的,存储在 RAM 中,并且仅在应用程序运行时才有意义。 但是,有些数据旨在持久存储,并存储在硬盘驱动器上以供以后使用。 当您进行编程时,无论是处理简单的脚本还是复杂的工具套件,通常都需要读取和写入文件。 每种语言处理此任务的方式都略有不同,本文演示了如何使用 Lua 处理数据文件。

安装 Lua

如果您使用的是 Linux,则可以从发行版的软件存储库中安装 Lua。 在 macOS 上,您可以从 MacPortsHomebrew 安装 Lua。 在 Windows 上,您可以从 Chocolatey 安装 Lua。

安装 Lua 后,打开您喜欢的文本编辑器并准备开始编写代码。

使用 Lua 读取文件

Lua 使用 io 库进行数据输入和输出。 以下示例创建一个名为 ingest 的函数,以从文件中读取数据,然后使用 :read 函数对其进行解析。 在 Lua 中打开文件时,您可以启用多种模式。 因为我只需要从此文件中读取数据,所以使用 r(表示“读取”)模式

function ingest(file)
   local f = io.open(file, "r")
   local lines = f:read("*all")
   f:close()
   return(lines)
end

myfile=ingest("example.txt")
print(myfile)

在代码中,请注意创建了变量 myfile 以触发 ingest 函数,因此,它会接收该函数返回的任何内容。 ingest 函数返回文件的行(来自一个直观地称为 lines 的变量)。 当在最后一步中打印 myfile 变量的内容时,文件的行将显示在终端中。

如果文件 example.txt 包含配置选项,那么我会编写一些额外的代码来解析该数据,可能会使用另一个 Lua 库,具体取决于配置是存储为 INI 文件还是 YAML 文件或其他格式。 如果数据是 SVG 图形,我将编写额外的代码来解析 XML,可能会使用 Lua 的 SVG 库。 换句话说,您的代码读取的数据可以在加载到内存后进行操作,但加载它只需要 io 库。

使用 Lua 将数据写入文件

无论您是存储用户使用应用程序创建的数据,还是仅存储有关用户在应用程序中所做操作的元数据(例如,游戏存档或最近播放的歌曲),都有很多充分的理由来存储数据以供以后使用。 在 Lua 中,可以通过 io 库打开文件、将数据写入其中并关闭文件来实现此目的

function exgest(file)
   local f = io.open(file, "a")
   io.output(f)
   io.write("hello world\n")
   io.close(f)
end

exgest("example.txt")

要从文件中读取数据,我以 r 模式打开文件,但这次我使用 a(表示“追加”)将数据写入文件末尾。 因为我将纯文本写入文件,所以我添加了自己的换行符 (\n)。 通常,您不会将原始文本写入文件,并且可能会使用其他库来写入特定格式。 例如,您可以使用 INI 或 YAML 库来帮助写入配置文件,使用 XML 库来写入 XML,依此类推。

文件模式

在 Lua 中打开文件时,有一些安全措施和参数可以定义文件的处理方式。 默认值为 r,它仅允许您读取数据

  • r 只读
  • w 覆盖或创建新文件(如果该文件尚不存在)
  • r+ 读取和覆盖
  • a 将数据附加到文件或创建新文件(如果该文件尚不存在)
  • a+ 读取数据、将数据附加到文件或创建新文件(如果该文件尚不存在)

还有一些其他的(例如,b 用于二进制格式),但这些是最常见的。 有关完整的文档,请参阅 Lua.org/manual 上的出色 Lua 文档。

Lua 和文件

与其他编程语言一样,Lua 具有丰富的库支持来访问文件系统以读取和写入数据。 由于 Lua 具有一致且简单的语法,因此很容易对任何格式的文件中的数据执行复杂的处理。 尝试将 Lua 用于您的下一个软件项目,或将其用作 C 或 C++ 项目的 API。

 

接下来阅读什么
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算行业工作,通常同时进行。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.