파일 내용 읽기
file:read() 메서드로 줄, 바이트, 전체 내용을 읽습니다.
파일 내용 읽기은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
파일 전체 읽기
f:read("a")(또는 "*a")를 사용하면 파일 전체를 문자열로 읽을 수 있습니다. 작거나 중간 크기의 파일에는 간단하고 적합한 방법입니다. 매우 큰 파일은 메모리 문제를 피하기 위해 청크 단위나 줄 단위로 읽으십시오.
local f = io.open("config.txt", "r")
if f then
local content = f:read("a")
f:close()
print("Size:", #content, "bytes")
print(content)
end한 줄씩 읽기
f:read("l")은 다음 줄을 읽고 줄 바꿈을 제거합니다. EOF에 도달하면 nil을 반환합니다. while을 사용하여 각 줄을 처리할 수 있습니다. f:lines()는 같은 작업을 수행하는 관용적인 축약형입니다.
local f = io.open("data.txt", "r")
if f then
local line = f:read("l")
while line ~= nil do
print(line)
line = f:read("l")
end
f:close()
end
-- Equivalent with for loop:
-- for line in io.lines("data.txt") do print(line) end지정한 바이트 수만큼 읽기
f:read(n)에 숫자를 전달하면 정확히 n바이트를 읽습니다. n바이트 이하의 문자열을 반환하며, EOF에 도달하면 더 적게 반환할 수 있고 EOF에서 nil을 반환합니다. 이 방법은 이진 프로토콜이나 구조화된 파일 형식을 읽을 때 사용합니다.
local f = io.open("binary.dat", "rb")
if f then
-- Read 4-byte header
local header = f:read(4)
if header then
print("Header bytes:", #header)
for i = 1, #header do
io.write(string.format("%02X ", header:byte(i)))
end
print()
end
f:close()
end숫자 읽기
f:read("n")은 파일에서 다음 숫자를 읽으며 공백은 건너뜁니다. Lua 숫자를 반환하고, 다음 토큰이 숫자가 아니면 nil을 반환합니다. 숫자로 구성된 구조화된 데이터 파일을 읽을 때 유용합니다.
-- File contains: "10 20 30.5 40"
local f = io.open("nums.txt", "r")
if f then
local total = 0
local n = f:read("n")
while n do
total = total + n
n = f:read("n")
end
f:close()
print("Sum:", total)
end파일에서 위치 이동하기
f:seek(whence, offset)는 파일 위치를 이동합니다. whence에는 "set"(시작 위치 기준), "cur"(현재 위치 기준), "end"(끝 위치 기준)를 지정합니다. 이동 후의 절대 위치를 반환합니다. 파일을 다시 읽거나 원하는 위치로 이동할 때 사용합니다.
local f = io.open("test.txt", "r")
if f then
-- Jump to end, get file size
local size = f:seek("end")
print("File size:", size, "bytes")
-- Seek back to start
f:seek("set", 0)
local first_line = f:read("l")
print("First line:", first_line)
f:close()
endCSV 파일 읽기
CSV 데이터를 줄 단위로 분석하려면 각 줄을 읽은 다음 string.gmatch를 사용하여 쉼표를 기준으로 나눕니다. 실제 서비스에서는 인용된 필드와 인용 부호 안의 쉼표를 처리해야 하지만, 단순한 데이터에는 기본적인 분할 방법으로 충분합니다.
local function parseCSV(path)
local rows = {}
for line in io.lines(path) do
local row = {}
for field in string.gmatch(line, "([^,]+)") do
row[#row+1] = field
end
rows[#rows+1] = row
end
return rows
end
-- Example: "Alice,30,Engineer"
-- => {{"Alice","30","Engineer"}}설정 파일 읽기
간단한 key=value 설정 형식에서는 줄 단위로 읽고, 주석과 빈 줄을 건너뛴 다음 string.match로 key=value 쌍을 분석합니다.
local function loadConfig(path)
local cfg = {}
for line in io.lines(path) do
-- Skip comments and blank lines
if not line:match("^%s*#") and line:match("%S") then
local k, v = line:match("^%s*(%w+)%s*=%s*(.-)%s*$")
if k then cfg[k] = v end
end
end
return cfg
end
local config = loadConfig("app.conf")
print(config.host, config.port)청크 단위로 읽기
큰 파일은 전체를 메모리에 올리지 않도록 고정된 크기의 청크 단위로 읽으십시오. 각 청크를 도착하는 즉시 처리합니다. 사용 가능한 RAM보다 큰 파일을 처리할 때 반드시 필요한 방법입니다.
local function processLarge(path, chunkSize)
chunkSize = chunkSize or 4096
local f, err = io.open(path, "rb")
if not f then return nil, err end
local totalBytes = 0
local chunk = f:read(chunkSize)
while chunk do
totalBytes = totalBytes + #chunk
-- process chunk here
chunk = f:read(chunkSize)
end
f:close()
return totalBytes
end한 줄에서 여러 값 읽기
각 줄에 공백이나 탭으로 구분된 값이 여러 개 들어 있다면 string.match 또는 string.gmatch를 사용하여 값을 추출합니다. 이 패턴은 단순한 구조화 텍스트 파일을 처리합니다.
-- File: "Alice 95 A\nBob 87 B"
local results = {}
for line in io.lines("grades.txt") do
local name, score, grade = line:match("(%S+)%s+(%d+)%s+(%S+)")
if name then
results[#results+1] = {
name=name,
score=tonumber(score),
grade=grade
}
end
end
for _, r in ipairs(results) do
print(r.name, r.score, r.grade)
endio.lines 축약형
io.lines(filename)은 파일을 열고 줄 반복자를 반환한 다음, 작업이 끝나면 파일을 닫습니다. 핸들을 직접 관리하지 않고 파일을 한 줄씩 읽는 가장 간결한 방법입니다.
-- Count non-empty lines
local count = 0
for line in io.lines("data.txt") do
if line:match("%S") then
count = count + 1
end
end
print("Non-empty lines:", count)
-- Collect all lines into a table
local lines = {}
for line in io.lines("data.txt") do
lines[#lines+1] = line
end
print("Total lines:", #lines)빠른 확인
파일 포인터가 이미 EOF에 있을 때 f:read("a")는 무엇을 반환합니까?
복습: 파일 읽기
요약:
f:read("a")— 파일 전체를 문자열로 반환f:read("l")— 줄 바꿈 없는 한 줄f:read(n)— 정확히 n바이트f:read("n")— 다음 숫자io.lines(path)— 줄 반복자, 자동으로 닫힘f:seek()— 위치로 이동
자주 묻는 질문
“파일 내용 읽기” 강의는 무료인가요?
네 — “파일 내용 읽기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“파일 내용 읽기”에서 뭘 배우나요?
file:read() 메서드로 줄, 바이트, 전체 내용을 읽습니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“파일 내용 읽기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.