0Pricing
Lua Academy · 강의

파일 내용 읽기

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()
end

CSV 파일 읽기

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)
end

io.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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. io.open으로 파일 열기
  2. 파일 내용 읽기
  3. 파일에 쓰고 내용 추가하기
  4. 파일 닫기와 오류 처리
← Lua Academy(으)로 돌아가기