قراءة محتويات الملفات
اقرأ الأسطر والبايتات والمحتوى الكامل باستخدام أساليب file:read()
قراءة محتويات الملفات درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في 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") السطر التالي مع إزالة محرف السطر الجديد. وتعيد 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 من البايتات (أقل من ذلك إذا تم الوصول إلى نهاية الملف)، أو تعيد 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: اقرأوا الملف سطرًا سطرًا، وتخطّوا التعليقات والأسطر الفارغة، ثم حلّلوا أزواج key=value باستخدام string.match.
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)القراءة على دفعات
بالنسبة إلى الملفات الكبيرة، اقرأوا الملف على دفعات ثابتة الحجم لتجنب تحميله بالكامل في الذاكرة. عالجوا كل دفعة فور وصولها. يُعد ذلك ضروريًا للملفات التي يتجاوز حجمها سعة ذاكرة الوصول العشوائي المتاحة.
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)تحقق سريع
ماذا تعيد f:read("a") عندما يكون مؤشر الملف عند نهاية الملف مسبقًا؟
مراجعة: قراءة الملفات
الملخص:
f:read("a")— الملف بأكمله كسلسلة نصيةf:read("l")— سطر واحد من دون محرف السطر الجديدf:read(n)— عدد n من البايتات بالضبطf:read("n")— العدد التاليio.lines(path)— مكرّر للأسطر يغلق الملف تلقائيًاf:seek()— الانتقال إلى موضع
الأسئلة الشائعة
هل درس «قراءة محتويات الملفات» مجاني؟
نعم — نص درس «قراءة محتويات الملفات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «قراءة محتويات الملفات»؟
اقرأ الأسطر والبايتات والمحتوى الكامل باستخدام أساليب file:read() تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «قراءة محتويات الملفات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فتح الملفات باستخدام io.open
- قراءة محتويات الملفات
- الكتابة إلى الملفات وإلحاق البيانات بها
- إغلاق الملفات ومعالجة الأخطاء