用 Lua 操作文件中的數(shù)據(jù)
了解 Lua 如何處理數(shù)據(jù)的讀寫。
有些數(shù)據(jù)是臨時(shí)的,存儲(chǔ)在 RAM 中,只有在應(yīng)用運(yùn)行時(shí)才有意義。但有些數(shù)據(jù)是要持久的,存儲(chǔ)在硬盤上供以后使用。當(dāng)你編程時(shí),無(wú)論是簡(jiǎn)單的腳本還是復(fù)雜的工具套件,通常都需要讀取和寫入文件。有時(shí)文件可能包含配置選項(xiàng),而另一些時(shí)候這個(gè)文件是你的用戶用你的應(yīng)用創(chuàng)建的數(shù)據(jù)。每種語(yǔ)言都會(huì)以不同的方式處理這項(xiàng)任務(wù),本文將演示如何使用 Lua 處理文件數(shù)據(jù)。
安裝 Lua
如果你使用的是 Linux,你可以從你的發(fā)行版軟件庫(kù)中安裝 Lua。在 macOS 上,你可以從 MacPorts 或 Homebrew 安裝 Lua。在 Windows 上,你可以從 Chocolatey 安裝 Lua。
安裝 Lua 后,打開你最喜歡的文本編輯器并準(zhǔn)備開始。
用 Lua 讀取文件
Lua 使用 io
庫(kù)進(jìn)行數(shù)據(jù)輸入和輸出。下面的例子創(chuàng)建了一個(gè)名為 ingest
的函數(shù)來(lái)從文件中讀取數(shù)據(jù),然后用 :read
函數(shù)進(jìn)行解析。在 Lua 中打開一個(gè)文件時(shí),有幾種模式可以啟用。因?yàn)槲抑恍枰獜倪@個(gè)文件中讀取數(shù)據(jù),所以我使用 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
是為了觸發(fā) ingest
函數(shù)而創(chuàng)建的,因此,它接收該函數(shù)返回的任何內(nèi)容。ingest
函數(shù)返回文件的行數(shù)(從一個(gè)稱為 lines
的變量中0。當(dāng)最后一步打印 myfile
變量的內(nèi)容時(shí),文件的行數(shù)就會(huì)出現(xiàn)在終端中。
如果文件 example.txt
中包含了配置選項(xiàng),那么我會(huì)寫一些額外的代碼來(lái)解析這些數(shù)據(jù),可能會(huì)使用另一個(gè) Lua 庫(kù),這取決于配置是以 INI 文件還是 YAML 文件或其他格式存儲(chǔ)。如果數(shù)據(jù)是 SVG 圖形,我會(huì)寫額外的代碼來(lái)解析 XML,可能會(huì)使用 Lua 的 SVG 庫(kù)。換句話說(shuō),你的代碼讀取的數(shù)據(jù)一旦加載到內(nèi)存中,就可以進(jìn)行操作,但是它們都需要加載 io
庫(kù)。
用 Lua 將數(shù)據(jù)寫入文件
無(wú)論你是要存儲(chǔ)用戶用你的應(yīng)用創(chuàng)建的數(shù)據(jù),還是僅僅是關(guān)于用戶在應(yīng)用中做了什么的元數(shù)據(jù)(例如,游戲保存或最近播放的歌曲),都有很多很好的理由來(lái)存儲(chǔ)數(shù)據(jù)供以后使用。在 Lua 中,這是通過(guò) io
庫(kù)實(shí)現(xiàn)的,打開一個(gè)文件,將數(shù)據(jù)寫入其中,然后關(guān)閉文件:
function exgest(file)
local f = io.open(file, "a")
io.output(f)
io.write("hello world\n")
io.close(f)
end
exgest("example.txt")
為了從文件中讀取數(shù)據(jù),我以 r
模式打開文件,但這次我使用 a
(用于”追加“)將數(shù)據(jù)寫到文件的末尾。因?yàn)槲沂菍⒓兾谋緦懭胛募?,所以我添加了自己的換行符(/n
)。通常情況下,你并不是將原始文本寫入文件,你可能會(huì)使用一個(gè)額外的庫(kù)來(lái)代替寫入一個(gè)特定的格式。例如,你可能會(huì)使用 INI 或 YAML 庫(kù)來(lái)幫助編寫配置文件,使用 XML 庫(kù)來(lái)編寫 XML,等等。
文件模式
在 Lua 中打開文件時(shí),有一些保護(hù)措施和參數(shù)來(lái)定義如何處理文件。默認(rèn)值是 r
,允許你只讀數(shù)據(jù):
r
只讀w
如果文件不存在,覆蓋或創(chuàng)建一個(gè)新文件。r+
讀取和覆蓋。a
追加數(shù)據(jù)到文件中,或在文件不存在的情況下創(chuàng)建一個(gè)新文件。a+
讀取數(shù)據(jù),將數(shù)據(jù)追加到文件中,或文件不存在的話,創(chuàng)建一個(gè)新文件。
還有一些其他的(例如,b
代表二進(jìn)制格式),但這些是最常見的。關(guān)于完整的文檔,請(qǐng)參考 Lua.org/manual 上的優(yōu)秀 Lua 文檔。
Lua 和文件
和其他編程語(yǔ)言一樣,Lua 有大量的庫(kù)支持來(lái)訪問(wèn)文件系統(tǒng)來(lái)讀寫數(shù)據(jù)。因?yàn)?Lua 有一個(gè)一致且簡(jiǎn)單語(yǔ)法,所以很容易對(duì)任何格式的文件數(shù)據(jù)進(jìn)行復(fù)雜的處理。試著在你的下一個(gè)軟件項(xiàng)目中使用 Lua,或者作為 C 或 C++ 項(xiàng)目的 API。