التعامل مع الملفات النصية من أكثر المهام التي يحتاجها مستخدمو Python سواء كانوا مبتدئين أو محترفين. قراءة البيانات، تعديلها، معالجتها، ثم حفظها مجددًا يمكن تنفيذه بسطرين فقط عند استخدام الأدوات الصحيحة داخل اللغة. قوة Python تظهر بوضوح في بساطة التعامل مع الملفات، حيث توفر دوال مباشرة للوصول إلى النصوص، تنظيمها، وتحويلها إلى شكل يناسب أي مشروع برمجي صغير أو كبير. فهم الأساسيات يمكّن المطور من إنجاز المهام بسرعة ودون تعقيد، خاصة عند العمل مع سجلات، إعدادات، أو بيانات تم جمعها من مصادر مختلفة.

هل تعمل مع الكثير من الملفات يوميًا؟ كبيرة وصغيرة؟ فوضوية ومنظمة؟ مهما كانت مهمتك، فإن بايثون يجعل التعامل مع الملفات غاية في السهولة. بقليل من البرمجة، يمكنك توفير ساعات من العمل والراحة. لنستكشف سحر بايثون في التعامل مع الملفات.
قراءة ملف نصي
عند العمل مع السجلات، أو ملفات التكوين، أو مجموعات البيانات، أو أي تنسيق نصي، فإن أول مهارة تحتاجها هي القدرة على قراءة ملف بكفاءة. تُسهّل بايثون هذه العملية تمامًا باستخدام دالة open() المدمجة وبعض أساليب القراءة المفيدة. في حين أن دالة open() هي البوابة القياسية، فإن الطريقة “البايثونية” للتعامل مع الملفات هي استخدام مدير السياق (عبارة with).
with open("server.log", "r") as f:
content = f.read()
print(content)
هذه هي طريقة “أعطني كل شيء”. إذا كان الملف صغيرًا أو متوسط الحجم، فهو مثالي. يُحمّل بايثون الملف بأكمله إلى الذاكرة كسلسلة نصية واحدة. استخدام with يضمن إغلاق بايثون للملف نيابةً عنك. يتولى بايثون إعداد وحذف موارد الملف.
إذا كنت ترغب في قراءة كل سطر على حدة، فاستخدم هذه الطريقة:
with open("users.txt", "r") as f:
for line in f:
print(line.strip())
يمكنك أيضًا الاستفادة من وظائف readline() و readlines() في Python.
# Read the first line
with open("data.txt", "r") as f:
first_line = f.readline()
# Read all lines into a list
with open("data.txt", "r") as f:
lines = f.readlines()
دالة readline() رائعة عندما تحتاج فقط إلى عدد محدد من الأسطر. هذا مفيد إذا كنت بحاجة إلى الوصول إلى أسطر محددة حسب الفهرس، على سبيل المثال، lines[5]. تُقدم لك دالة readlines() كل سطر كقائمة، وهو أمر مناسب للفهرسة والتقطيع والتحويلات السريعة.
الكتابة إلى ملفات نصية
في النهاية، يحتاج كل مطور بايثون إلى إعادة إدخال شيء ما إلى ملف. ربما كنت تُنشئ تقارير، أو تحفظ بيانات مُنظّفة، أو تكتب سجلات من نصك البرمجي. الخبر السار هو أن الكتابة إلى الملفات في بايثون سهلة مثل قراءتها. لكتابة محتوى جديد إلى ملف:
report = "Daily summary: All systems operational.\n"
with open("summary.txt", "w") as f:
f.write(report)
log_entry = "User logged in at 14:32\n"
with open("activity.log", "a") as f:
f.write(log_entry)
lines = [
"apple\n",
"banana\n",
"cherry\n"
]
with open("fruits.txt", "w") as f:
f.writelines(lines)
البحث داخل الملفات النصية
target = "ERROR"
with open("server.log", "r") as f:
for line in f:
if target in line:
print("Found error:", line.strip())
import re
pattern = re.compile(r"User\s+\d+\s+logged\s+in")
with open("activity.log", "r") as f:
for line in f:
if pattern.search(line):
print("Match:", line.strip())

فكّر في سيناريوهات تحتاج فيها إلى اكتشاف المعرفات، والطوابع الزمنية، والتنسيقات، أو أي شيء ذي بنية. في هذا المثال، نجد أسطرًا سجّل فيها مستخدم دخوله بمعرف رقمي.
استبدال نص في ملفات
البحث رائع. ولكن عاجلاً أم آجلاً، ستحتاج إلى تغيير محتوى الملف. تُسهّل بايثون استبدال النص بشكل مدهش بمجرد معرفة الأنماط الأساسية. لمهام البحث والاستبدال الأساسية، يمكنك استخدام عمليات بايثون النصية.
old = "ERROR"
new = "INFO"
with open("server.log", "r") as f:
content = f.read()
updated = content.replace(old, new)
with open("server.log", "w") as f:
f.write(updated)
import re
pattern = r"\bUser\s+(\d+)\b"
replacement = r"Account \1"
with open("activity.log", "r") as f:
content = f.read()
updated = re.sub(pattern, replacement, content)
with open("activity.log", "w") as f:
f.write(updated)
لنفترض أن لديك ملفًا نصيًا، وتحتاج إلى بعض المقاييس الأساسية، مثل عدد الأسطر والكلمات وعدد مرات ظهور الكلمة. يمكن أن تكون هذه المعلومات مفيدة لتحليل النصوص والتقارير ومعالجة البيانات. تُسهّل بايثون هذا الأمر. يمكنك استخدام الحلقات للعدّ.
line_count = 0
char_count = 0
with open(“notes.txt”, “r”) as f:
for line in f:
line_count += 1
char_count += len(line)
print(“Lines:”, line_count)
print(“Characters:”, char_count)
هذه الحلقة البسيطة تعمل بشكل جيد حتى مع الملفات الكبيرة. اقرأ سطرًا واحدًا في كل مرة، ثم عدّه، وتتبع إجمالي الأحرف على طوله. لعدّ الكلمات:
word_count = 0
with open("notes.txt", "r") as f:
for line in f:
words = line.split()
word_count += len(words)
print("Words:", word_count)
يؤدي تقسيم كل سطر باستخدام .split() إلى توفير قائمة من الكلمات، وهو أمر مثالي عند القيام بقياسات بسيطة تعتمد على الكلمات.
لتحليل الكلمات بشكل أكثر تقدمًا، يمكنك الاستفادة من وحدة collections ، مثل هذا:
from collections import Counter
counter = Counter()
with open("notes.txt", "r") as f:
for line in f:
counter.update(line.split())
print(counter.most_common(5))

إذا كنت بحاجة لمعرفة الكلمات الأكثر شيوعًا، فإن أداة “العداد” مفيدة للغاية. فهي تحسب العناصر نيابةً عنك، ويمكنها حتى إخبارك بأكثر الكلمات شيوعًا (N) باستخدام دالة .most_common().
تقسيم الملفات ودمجها
قد تصبح ملفات النصوص ضخمة. تخيل العمل مع مجموعات بيانات تحتوي على ملايين الصفوف، أو عمليات تصدير ضخمة جدًا يصعب التعامل معها دفعة واحدة. أحيانًا تحتاج إلى تقسيم ملف إلى أجزاء أصغر، وأحيانًا أخرى تحتاج إلى دمج ملفات متعددة في ناتج واحد واضح وموحد. تتعامل بايثون مع كلتا المهمتين بسهولة.
إحدى طرق تقسيم ملف هي أخذ عدد ثابت من الأسطر وكتابتها في ملفات جديدة. إليك الطريقة:
chunk_size = 10
file_number = 1
current_lines = []
with open("bigdata.txt", "r") as f:
for i, line in enumerate(f, start=1):
current_lines.append(line)
if i % chunk_size == 0:
output_name = f"chunk_{file_number}.txt"
with open(output_name, "w") as out:
out.writelines(current_lines)
current_lines = []
file_number += 1
# write any remaining lines
if current_lines:
output_name = f"chunk_{file_number}.txt"
with open(output_name, "w") as out:
out.writelines(current_lines)
لدمج ملفات متعددة في وحدة واحدة، تعتبر وحدة glob الخاصة بـ Python مفيدة.
import glob
with open("merged_output.txt", "w") as outfile:
for filename in glob.glob("logs/log*"):
with open(filename, "r") as infile:
outfile.write(infile.read())
هنا، يجمع glob جميع الملفات التي تبدأ بـ log في مجلد logs/، ويمكنك ببساطة إضافة محتوياتها إلى ملف واحد. يُعد هذا مثاليًا عند التعامل مع ملفات السجلات اليومية، أو تصدير البيانات الجزئية، أو أي مجلد مليء بالملفات المرتبطة ببعضها.
بمجرد دمج أدواتك، يمكنك أتمتة جميع أنواع المهام الروتينية. على سبيل المثال، دمج السجلات الأسبوعية في سجل شهري، وتقسيم ملفات الإدخال الكبيرة قبل إدخالها في برنامج نصي، وغيرها.
معالجة الأخطاء وعمليات الملفات الآمنة
عند العمل مع الملفات في الواقع، لا تسير الأمور دائمًا كما هو مخطط لها. قد تفشل عمليات الملفات لعدة أسباب. قد لا يكون الملف موجودًا، أو قد لا يملك برنامجك الإذن لقراءته أو الكتابة إليه. إذا تعطل البرنامج النصي في منتصف العملية، فأنت تُخاطر بإتلاف البيانات أو ترك ملفات غير مكتوبة بالكامل.
لإدخال/إخراج ملفات أكثر أمانًا، يُنصح باستخدام كتلة try/except في بايثون لمعالجة أخطاء بايثون.
filename = "config.txt"
try:
with open(filename, "r") as f:
data = f.read()
print("File loaded successfully.")
except FileNotFoundError:
print("File not found:", filename)
except PermissionError:
print("You don’t have permission to read this file.")
except Exception as e:
print("Unexpected error:", e)

يتيح لك هذا اكتشاف المشاكل المتوقعة، مثل الملفات المفقودة أو مشاكل الأذونات. من المشاكل الشائعة الأخرى التي قد تواجهها الترميز. لذا، تأكد من التعامل معها عندما لا تكون متأكدًا من نوع الترميز الذي قد يستخدمه الملف.
try:
with open("encoding.txt", "r", encoding="utf-8") as f:
content = f.read()
print("File loaded successfully.")
except UnicodeDecodeError:
print("File encoding is not UTF-8. Trying fallback…")
with open("encoding.txt", "r", encoding="latin-1") as f:
content = f.read()
print("Fallback load succeeded:")
print(content)
إتقان التعامل مع الملفات النصية يمنح مطوري Python قدرة أكبر على إدارة البيانات وتنظيمها داخل مشاريعهم. الأدوات الأساسية للغة كافية لإنجاز أغلب العمليات دون الحاجة إلى مكتبات خارجية، ومع الممارسة يصبح تنفيذ هذه المهام أسرع وأكثر سهولة. فهم هذه الأساليب يعد خطوة مهمة لكل من يرغب في تطوير مهاراته البرمجية وتوسيع قدرته على بناء مشاريع أكثر احترافية.

