لیست مطالب

کار با فایل در پایتون

کار با فایل در پایتون

کار با فایل‌ها در پایتون  برای ذخیره و یا خواندن داده‌ها استفاده می شود. در پایتون برای باز کردن فایل از تابع ()open استفاده می‌کنیم. این تابع نام فایل و حالت (mode) را می‌گیرد و یک object (شیء) فایل برمی‌گرداند.

در واقع تابع ()open مثل یک قفل چندکلیده است؛ با گذاشتن کلید مناسب ('r', 'w', ‌‌'a',‌ …) دقیقاً تعیین می‌کند فایلتان فقط خوانده شود، پاک و یا بازنویسی شود، یا اینکه آخر آن چیزی افزوده شود.

وقتی می‌خواهیم یک فایل را در پایتون باز کنیم، باید مشخص کنیم که قرار است از فایل چه استفاده ای بشود:
آیا می‌خواهیم فایل را بخوانیم، چیزی داخل آن بنویسیم، یا مطالبی به آخر آن اضافه کنیم.به این انتخاب‌ها می‌گویند حالت‌های باز کردن فایل(mode).

همچنین می‌توانیم مشخص کنیم که فایل به صورت متنی (text) باز شود یا باینری (binary).به‌طور پیش‌فرض، فایل‌ها در حالت متنی (‘t’) باز می‌شوند، مگر اینکه حالت باینری (‘b’) را خودمان تعیین کنیم.

  • حالت ‘r’ برای خواندن فایل می باشد؛ اگر فایل وجود نداشته باشد، خطای I/O می‌دهد.
  • حالت ‘w’ برای نوشتن در فایل می باشد. اگر فایل وجود داشته باشد، محتوای داخل آن را پاک (truncate) کرده و  محتوای جدید را اضافه می کند؛ و اگر فایل وجود نداشته باشد فایل جدیدی می‌سازد و محتوا را به آن اضافه می کند.
  • حالت ‘a’ برای اضافه کردن به انتهای فایل است: داده‌های نوشته‌شده به انتهای فایل اضافه می‌شوند و اگر فایل وجود نداشته باشد، ساخته می‌شود.
  • حالت ‘x’ برای ایجاد انحصاری فایل است: اگر فایل از قبل وجود داشته باشد خطا می‌دهد (FileExistsError)، در غیر این صورت فایل جدیدی ایجاد می‌کند.
  • حالت‌های ترکیبی مانند ‘+r+’, ‘w+’, ‘a’ برای خواندن و نوشتن همزمان هستند: مثلاً ‘r+’ فایل موجود را برای خواندن/نوشتن باز می‌کند (اگر فایل نباشد خطا می‌دهد)، ‘+w’ فایل را برای خواندن/نوشتن باز کرده و اگر وجود داشته باشد آن را خالی می‌کند، و ‘+a’ برای اضافه کردن و خواندن باز می‌کند.

با اضافه کردن حرف ‘b’ به حالت(mode)، فایل به شکل باینری باز می‌شود (‘rb’, ‘wb’, …). بدون آن (یا با ‘t’) فایل به صورت متنی باز می‌شود. در حالت باینری متدهای ()read و ()write به جای رشته (str)، بایت (bytes) می‌خوانند و می‌نویسند.

انواع حالت ها

‘r’ – خواندن فایل در پایتون(read)

در اینجا یک فایل به نام text.txt درست می کنیم و متنی داخلش مینویسیم.

				
					Hello! This is a sample text file.
We are learning Python file handling.
Have a great day!
    
				
			

و بعد هم در فایل پایتونی خود ،کد زیر را مینویسیم.

				
					file = open("text.txt", "r", encoding="utf-8")
content = file.read()
print(content)
file.close()
				
			

تابع ()open برای باز کردن فایل استفاده می‌شود.

“text.txt” نام فایلی است که قرار است باز شود. این فایل باید در همان مسیری باشد که فایل پایتون در آن اجرا می‌شود.
“r” به معنی “read” است، یعنی فایل فقط برای خواندن باز می‌شود.
encoding=”utf-8 مشخص می‌کند که فایل با کدگذاری UTF-8 خوانده شود؛ این کار برای پشتیبانی از متن های فارسی یا دیگر زبان‌های غیرلاتین مهم است.
خروجی این تابع، یک شیء فایل است که در متغیر file ذخیره می‌شود.

در ()content = file.read، متد ()read کل محتوای فایل را به صورت یک رشته‌ی متنی (string) می‌خواند.

نتیجه‌ی این عملیات در متغیر content ذخیره می‌شود.
و محتوایی که خوانده شده، با استفاده از ()print در خروجی (ترمینال) نمایش داده می‌شود.

 با دستور ()file.close ، فایل بسته می‌شود. بستن فایل مهم است چون منابع سیستم آزاد می‌شوند و از بروز خطا در خواندن/نوشتن فایل جلوگیری می‌کند.

 توجه :وقتی از حالت “r” (خواندن) استفاده می‌کنید، پایتون توقع دارد فایل وجود داشته باشد. اگر فایل وجود نداشته باشد، یک خطا (استثنا) رخ می‌دهد به اسم FileNotFoundError.

با اجرای کد ، خروجی در ترمینال این‌طوری خواهد بود:

				
					Hello! This is a sample text file.
We are learning Python file handling.
Have a great day!

				
			

در پایتون، زمانی که با فایل‌ها کار می‌کنید، باید بعد از اتمام کار، فایل را ببندید (close) تا منابع سیستم آزاد شوند.

وقتی می‌گیم “منابع سیستم آزاد بشه” یعنی چی؟

هر وقت برنامه‌ای مثل پایتون یک فایل رو باز می‌کند (مثلاً با ()open)، سیستم مقداری از حافظه و انرژی کامپیوتر رو به اون فایل اختصاص می‌دهد تابتوان با آن کار کرد. مثل اینه که:درِ یک دفترچه رو باز کردید تا چیزی بنویسید یا بخونید. تا وقتی دفترچه بازهست، اون فضا اشغال شده و کسی دیگر نمی‌تواند راحت با اون دفترچه کار کند.

اگر این کار را فراموش کنید یا برنامه وسط کار خطا بدهد، فایل باز می‌ماند که می‌تواند باعث:

مصرف غیرضروری منابع سیستم، یا بروز خطا در باز کردن فایل در آینده، یا حتی خراب شدن داده‌ها شود.

برای همین پایتون یک روش بهینه و ایمن‌تر به اسم context manager یا همان دستور with ارائه کرده.

				
					with open("text.txt", "r", encoding="utf-8") as file:
        content = file.read()
        print(content)

				
			

“text.txt” :نام فایل متنی است که می‌خوایم بازش کنیم.
“r” : فایل را در حالت خواندن باز می‌کنه (Read mode).
encoding=”utf-8″ : برای اینکه حروف فارسی و دیگر کاراکترهای خاص به‌درستی خوانده شوند.
as file :اسم دلخواهی برای شیء فایل تعیین می‌کند (می‌توانستید مثلاً بنویسید as f).در این روش نیازی به ()file.close نیست.

در روش زیر هم با استفاده از try/except  کد را کامل تر کردیم.

				
					# r_mode_example
try:
        with open("notes.txt", "r", encoding="utf-8") as f:
             print(f.read())
except FileNotFoundError as e:
        print("⚠️ فایل پیدا نشد:", e)

				
			

بلوک try را مینویسیم تا خطاهای احتمالی را بگیریم.

()open: تابع داخلی پایتون برای باز کردن فایل‌ها است.

“notes.txt”: نام فایل مورد نظر برای باز کردن.

از with فقط برای فایل‌ها استفاده نمی‌شود؛ برای کار با پایگاه داده، قفل‌های چندنخی (threading locks)، شبکه و حتی باز کردن عکس و ویدیو هم کاربرد داره.

متدهای خواندن فایل در پایتون

read(size=-1):

 کل محتویات فایل را می خواند  و size تعداد بایت‌هایی که باید خوانده شود. پیش‌فرض 1- به معنی خواندن کل فایل است.
اگر() file.read،بدون آرگومان باشد یعنی همهٔ فایل رو از ابتدا تا انتها بخوان.بطور مثال فایل زیر فایل متنی ما می باشد.

				
					!سلام دنیا
				
			
				
					with open("example.txt", "r", encoding='utf-8') as file:
        content = file.read()
        print(content)  # خروجی: سلام دنیا!

				
			

اگر ()file.read دارای پارامتر باشد مانند کد پایین که پارامتر 5 هست یعنی فقط ۵ کاراکتر اول فایل را بخوان.

				
					with open("example.txt", "r", encoding="utf-8") as f:
        print(f.read(5))

				
			

خروجی:

				
					سلام 

				
			

نکته:اگر چند بار(…) f.read پشت هم بنویسید، هر بار از جایی که نشانگر ایستاده شروع به خواندن می‌کند. نه از اول!

readline(size=-1):

یک خط از فایل را می خواند و size تعداد بایت‌هایی که باید خوانده شود. پیش‌فرض 1– به معنی خواندن کل خط است.

فرض کنید یک  فایل example.txt  داریم:

				
					!سلام دنیا
خوبی؟

				
			
				
					with open("example.txt", "r", encoding='utf-8') as file:
        line = file.readline()
        print(line)  # خروجی: سلام دنیا!

				
			
				
					سلا

				
			

چون گفتیم فقط ۴ کاراکتر بخون، پس فقط همون ۴ تای اول خونده شده.

readlines(hint=-1):

خواندن تمام خطوط فایل و بازگرداندن آن‌ها به صورت لیست.

hint: تعداد بایت‌هایی که باید خوانده شود. پیش‌فرض 1 به معنی خواندن کل فایل است.

مثال:

				
					with open("example.txt", "r", encoding='utf-8') as file:
        lines = file.readlines()
        print(lines)  # خروجی: ['سلام دنیا!']

				
			

 

تابعکاری که می‌کند
()readکل فایل رو می‌خونه
read(n)فقط n کاراکتر می‌خونه
()readlineیه خط می‌خونه
()readlinesکل فایل رو به صورت لیست خط‌ها می‌خونه
 

‘w’ -نوشتن در فایل در پایتون(write)

“w”: حالت باز کردن فایل در حالت فقط نوشتن. اگر فایل وجود داشته باشد، محتویات آن پاک می‌شود؛ در غیر این صورت، فایل جدیدی ایجاد می‌شود.

در حال حاضر ،فایل report.txt  شامل متن زیر می باشد.

				
					Python is a powerful programming language.
It is easy to learn and very versatile.
Python can be used for web development, data analysis, AI, and more.
Many developers love Python because of its clean syntax.
Start your coding journey with Python today!

				
			
				
					with open("report.txt", "w", encoding="utf-8") as f:
        f.write("Welcome to Python programming!\n")
print("✅ report.txt ایجاد یا پاک‌سازی و سپس نوشته شد.")

				
			

محتوای “Welcome to Python programming!\n” را داخل فایل می‌نویسد.

n\ به معنای خط جدید است.

یعنی فایل یا ساخته شده یا محتواش پاک شده و متن جدید در آن نوشته شده است.

 پس از اجرای کد ،متن قبلی report.txt  پاک شده و متن زیر  در فایل قرار گرفته است و اگر فایل report.txt وجود نداشته باشد ساخته می شود .

				
					Welcome to Python programming!

				
			

متدهای نوشتن در فایل:

write(string):

نوشتن یک رشته به فایل.

string: رشته‌ای که باید نوشته شود.

				
					with open("example.txt", "w", encoding='utf-8') as file:
        file.write("خط اول\n")
        file.write("خط دوم\n")

				
			

خروجی:

				
					خط اول
خط دوم

				
			

writelines(lines):

نوشتن لیستی از رشته‌ها به فایل.

lines: لیستی از رشته‌ها که باید نوشته شوند.

				
					lines = ["خط 1\n", "خط 2\n", "خط 3\n"]
with open("example.txt", "w", encoding='utf-8') as file:
        file.writelines(lines)

				
			

خروجی:

				
					خط 1
خط 2
خط 3

				
			

‘a’ –نوشتن در انتهای فایل(append)

				
					with open("example.txt", "a", encoding="utf-8") as file:
    file.write("این یک خط جدید است.\n")

				
			

()open: تابع داخلی پایتون برای باز کردن فایل‌ها است.

“example.txt”: نام فایلی است که قصد داریم باز کنیم. اگر فایل وجود نداشته باشد، پایتون آن را می سازد.

“a”: حالت باز کردن فایل در حالت الحاق (append). در این حالت، داده‌های جدید به انتهای فایل اضافه می‌شوند بدون اینکه محتوای قبلی تغییر کند.اگر فایل example.txt وجود نداشته باشد، پایتون آن را ایجاد می‌کند.

(“این یک خط جدید است.n\”)file.write

()file.write: متد ()write برای نوشتن داده‌ها در فایل استفاده می‌شود. در اینجا، رشته‌ی “این یک خط جدید است.\n” به انتهای فایل اضافه می‌شود.

n\: کاراکتر newline است که باعث می‌شود متن بعدی در خط جدید نوشته شود.

‘x’ – ایجاد فایل جدید (اگر وجود نداشته باشد)

“x”: حالت باز کردن فایل در حالت ایجاد انحصاری. تلاش می‌کند فایل جدیدی ایجاد کند. اگر فایل از قبل وجود داشته باشد، خطای FileExistsError ایجاد می‌شود.

				
					try:
        with open("once.txt", "x", encoding="utf-8") as f:
            f.write("این فایل اولین‌باره ساخته می‌شود.")
except FileExistsError:
        print("⚠️ once.txt از قبل وجود دارد؛ پس نمی‌نویسم.")

				
			

(…)f.write: نوشتن متن مشخص‌شده در فایل.

except FileExistsError: اگر فایل وجود داشته باشد، پیام هشدار را چاپ می‌کند.

متد های فایل درپایتون

متد seek در پایتون

متد seek() در پایتون برای تغییر موقعیت مکان‌نما (cursor) در فایل استفاده می‌شود. این موقعیت مشخص می‌کند که عملیات خواندن یا نوشتن بعدی از کدام نقطه در فایل آغاز شود.ساختار کلی متد:
				
					
file.seek(offset, whence=0)

				
			
offset: تعداد بایت‌هایی است که باید نسبت به نقطه‌ی مرجع جابه‌جا شد. و whence نقطه‌ی مرجع برای شروع جابه‌جایی. مقدار پیش‌فرض آن 0 است و می‌تواند یکی از مقادیر زیر باشد:
مقدارمعنا
0از ابتدای فایل (default)
1از موقعیت فعلی مکان‌نما
2از انتهای فایل
مثال‌های کاربردی: seek(0) – بازگشت به ابتدای فایل
				
					
with open("example.txt", "r", encoding="utf-8") as file:
    file.seek(0)
    content = file.read()
    print("خروجی:", content)

				
			
				
					خروجی: سلام دنیا!

				
			

چون از اول فایل را می‌خواند، کل جمله چاپ می‌شود.

seek(3) : یعنی از کاراکتر سوم بخوانید.

				
					with open("example.txt", "r", encoding='utf-8') as file:
         file.seek(3)  # از ابتدای فایل، ۳ کاراکتر جلو برو
         content = file.read()
         print("خروجی:", content)

				
			
				
					خروجی: م دنیا!

				
			
				
					with open("example.txt", "r", encoding="utf-8") as file:
        file.read(2)         # خواندن ۲ کاراکتر اول → "س" و "ل"
        file.seek(3, 1)      # از موقعیت فعلی ۳ کاراکتر جلو برو
        content = file.read()
        print(content)

				
			
				
					نیا!

				
			

چون بعد از read(2)، نشانگر روی حرف “ا” بود، با seek(3, 1) می‌ره روی “ن” و از اونجا می‌خونه.

seek(offset, 2) : از انتهای فایل

یعنی از انتهای فایل، n کاراکتر عقب برگردید.

این حالت در فایل متنی معمولاً در همه سیستم‌ها پشتیبانی نمی‌شه، چون دقت بایت با کاراکترهای چندبایتی فارسی فرق داره.
اما در حالت باینری (rb) کاملاً کاربرد داره.

				
					with open("example.txt", "r", encoding="utf-8") as file:
        file.seek(-4, 2)
        content = file.read()
        print(content)

				
			

خروجی (اگر اجرا بشه):

				
					یا!

				
			

یعنی ۴ کاراکتر از انتهای فایل برگشته و از انجا خوانده.

متد seek() مکان‌نمای فایل را به موقعیت دلخواه می‌برد و امکان کنترل دقیق خواندن یا نوشتن را فراهم می‌کند.
این متد با همه حالت‌های باز کردن فایل (مثل “r”، “w”، “rb”، “r+”) قابل استفاده است.
پارامتر اول seek() تعداد بایت‌هایی است که باید جابه‌جا شود، و پارامتر دوم مبنای حرکت مکان‌نما را مشخص می‌کند (0 از ابتدای فایل، 1 از مکان فعلی، 2 از انتهای فایل).
متد seek() در فایل‌های باینری دقیق‌تر عمل می‌کند، به‌ویژه وقتی با کاراکترهای چندبایتی (مثل فارسی یا ایموجی‌ها) سروکار داریم.
ترکیب seek() با tell() بسیار مفید است؛ مثلاً برای بازنویسی بخش خاصی از فایل، یا بررسی موقعیت فعلی مکان‌نما پس از جابه‌جایی.

 

tell

در پایتون، هر وقت فایلی را باز می‌کنیم و شروع به خواندن یا نوشتن می‌کنیم، مکان‌نمایی (cursor) در آن فایل نگه می‌دارد.
این مکان‌نما مشخص می‌کند که فایل از کجای متن خوانده می‌شود یا داده‌ها از کجا در آن نوشته می‌شوند.

متد tell به ما می‌گوید که الان مکان‌نما در چه موقعیتی قرار دارد؛ یعنی از ابتدای فایل تا جای فعلی چند بایت جلو رفته‌ایم.

مثال ۱ – بررسی مکان‌نما در ابتدای فایل

فایل زیر “sample.txt”. می باشد.

				
					Hello World

				
			
				
					with open("sample.txt", "r", encoding="utf-8") as f:
        pos = f.tell()
        print("Cursor position at start of file:", pos)

				
			

خروجی  کد:

				
					Cursor position at start of file: 0

				
			

 مثال ۲ – بررسی مکان‌نما بعد از خواندن چند کاراکتر

				
					Cursor position at start of file: 0

				
			

محتوای فایل:

				
					Data Analysis
				
			
				
					
with open("sample.txt", "r", encoding="utf-8") as f:
        text = f.read(4)
        print("Read content:", text)
        print("Cursor position after reading:", f.tell())

				
			

خروجی  کد:

				
					
Read content: Data
Cursor position after reading: 4

				
			

 در این مثال ما چهار کاراکتر انگلیسی (که هر کدام یک بایت هستند) خوانده‌ایم.بنابراین، مکان‌نما ۴ بایت جلو رفته و f.tell() عدد ۴ را برمی‌گرداند.

مثال ۳ – ترکیب با متد seek()

محتوای فایل:

				
					Programming
				
			
				
					
with open("sample.txt", "r", encoding="utf-8") as f:
        f.seek(3)
        print("After seek(3):", f.tell())
        f.read(5)
        print("After reading 5 more characters:", f.tell())


				
			

خروجی  کد:

				
					
After seek(3): 3
After reading 5 more characters: 8

				
			

در ابتدا مکان‌نما را با seek(3) به موقعیت سوم (بایت سوم) بردیم.سپس با خواندن پنج کاراکتر دیگر، مکان‌نما به موقعیت ۸ رسید.

نکات درباره متد tell:

متد tell() همیشه تعداد بایت‌هایی که مکان‌نما از ابتدا جلو رفته را برمی‌گرداند.
این متد در همه حالت‌های باز کردن فایل (مانند “r”، “w”، “rb”) قابل استفاده است.
همراه با متد seek() بسیار کاربردی است؛ مثلاً برای بازنویسی بخشی از فایل یا برگشت به ابتدای آن.

 متد truncate

وقتی می‌خواهیم فایل متنی یا باینری را کوتاه کنیم و فقط بخشی از آن را نگه داریم، از متد truncate() استفاده می‌کنیم.این متد اجازه می‌دهد فایل را تا اندازه‌ای مشخص برش بدهیم؛ یعنی همه‌ی داده‌های بعد از آن اندازه حذف می‌شوند.اگر اندازه‌ای مشخص نکنیم، فایل از موقعیت فعلی مکان‌نما (cursor) به بعد کوتاه می‌شود.

مثال ۱ – کوتاه کردن فایل به اندازه مشخص

محتوای فایل sample.txt:

				
					
Artificial Intelligence

				
			
				
					
with open("sample.txt", "r+", encoding="utf-8") as f:
        f.truncate(10)

				
			

خروجی :

				
					Artificia
				
			

 در این مثال، فایل را به اندازه ۱۰ بایت (در اینجا ۱۰ کاراکتر چون حروف انگلیسی هستند) برش داده‌ایم.
تمام محتوای بعد از این نقطه حذف شده است. توجه کنید که برای استفاده از truncate() باید فایل را در حالت نوشتن باز کنیم، مثلاً “r+”.

محتوای فایل:

				
					Deep Learning with Python

				
			
				
					
with open("sample.txt", "r+", encoding="utf-8") as f:
    f.seek(5)
    f.truncate()
				
			

محتوای فایل بعد از اجرا:

				
					Deep
				
			

 در ابتدا مکان‌نما را به موقعیت ۵ برده‌ایم (بعد از حرف p در “Deep “).سپس با اجرای truncate() بدون آرگومان، همه‌چیز بعد از مکان‌نمای فعلی حذف شده است.

نکات پایانی درباره متد truncate:

با متد truncate() می‌توانیم فایل را کوتاه کنیم و فقط بخشی از آن را نگه داریم.

اگر هیچ عددی به آن ندهیم، از مکان‌نمای فعلی تا انتهای فایل حذف می‌شود.

برای استفاده از آن، باید فایل را در حالت نوشتن باز کرده باشیم (مانند “w”، “a”، یا “r+”).

این متد هم در فایل متنی (“r+”) و هم باینری (“rb+”) قابل استفاده است.

متد flush

وقتی در پایتون داده‌ای را در یک فایل می‌نویسیم، معمولاً آن داده‌ها فوراً در فایل ذخیره نمی‌شوند.پایتون ابتدا داده‌ها را در حافظه موقتی (buffer) نگه می‌دارد و بعد از مدتی آن‌ها را وارد فایل می‌کند.متد flush باعث می‌شود داده‌های داخل بافر بلافاصله و بدون تأخیر در فایل نوشته شوند.

				
					open("text.txt", "r+")

				
			

مثال ۱ – نوشتن سریع داده‌ها در فایل

				
					
with open("sample.txt", "w", encoding="utf-8") as f:
        f.write("Hello, world!")
        f.flush()

				
			

 در این مثال ما متنی را در فایل می‌نویسیم و بلافاصله با f.flush() آن را از بافر به خود فایل منتقل می‌کنیم.بدون این دستور، ممکن است نوشتن تا زمان بستن فایل یا پر شدن بافر تأخیر داشته باشد.

مثال ۲ – استفاده همراه با حلقه

				
					import time

with open("log.txt", "w", encoding="utf-8") as f:
        for i in range(3):
            f.write(f"Log line {i}\n")
            f.flush()
            time.sleep(1)


				
			

 در این مثال، هر یک ثانیه یک خط در فایل نوشته می‌شود.با استفاده از flush() بعد از هر خط، مطمئن می‌شویم که نوشته‌ها فوراً در فایل ثبت شوند، حتی اگر فایل هنوز بسته نشده باشد.

مثال ۳ – استفاده با sys.stdout

				
					import time

with open("log.txt", "w", encoding="utf-8") as f:
        for i in range(3):
            f.write(f"Log line {i}\n")
            f.flush()
            time.sleep(1)


				
			

 در اینجا از flush=True در تابع print() استفاده کرده‌ایم.
این باعث می‌شود که خروجی فوراً در ترمینال نمایش داده شود و منتظر پر شدن بافر نماند.

نکات درباره متد flush:

flush بافر حافظه را تخلیه می‌کند و داده‌ها را فوراً در فایل می‌نویسد.
معمولاً همراه با نوشتن فایل‌ها یا لاگ‌ها استفاده می‌شود تا از ذخیره‌شدن مطمئن باشیم.
این متد فقط روی فایل‌هایی که قابلیت نوشتن دارند (حالت “w”، “a” یا “r+”) کاربرد دارد.
در برنامه‌هایی که داده‌ها به‌صورت لحظه‌ای نوشته می‌شوند (مثل لاگ‌گیری یا گزارش‌های زنده)، flush() بسیار مفید است.

‘r+’ – خواندن و نوشتن (بدون پاک‌سازی محتوا)

حالت +r به این معناست که فایل را برای خواندن و نوشتن همزمان باز می‌کنید.

				
					open("text.txt", "r+")

				
			

پس از باز شدن فایل با “r+” چه اتفاقی می‌افتد؟

پایتون فایل را باز می‌کند و از ابتدای آن شروع به خواندن می‌نماید.
سپس شما می‌توانید از همان نقطه (یا هر جای دیگری که مشخص می‌کنید) روی فایل بنویسید.

اما توجه کنید:
زمانی که می‌خواهید بنویسید، نوشتن از همان مکانی آغاز می‌شود که نشانگر (cursor) قرار دارد.
اگر متن جدید روی متن قبلی قرار بگیرد، آن را جایگزین می‌کند، نه اینکه متن جدید را لابه‌لای متن قبلی درج نماید.

منظور از «جایگزین شدن» چیست؟

فرض کنید محتوای فایل text.txt به صورت زیر باشد:

				
					Hello Python
				
			
				
					with open("text.txt", "r+", encoding="utf-8") as file:
        file.write("Hi")

				
			

اکنون اگر با “r+” بنویسید و نشانگر فایل نیز در ابتدای آن باشد (که به‌صورت پیش‌فرض همین‌گونه است)، محتوای نهایی فایل به این شکل خواهد شد:

				
					HiLlo Python

				
			

یعنی H و e حذف شده و H و i جای آن‌ها را گرفته‌اند.
هیچ چیزی به انتهای فایل اضافه نمی‌شود؛ فقط بخش مشخصی از متن جایگزین خواهد شد.

در چه مواردی کاربرد دارد؟

زمانی که نیاز دارید یک فایل را بخوانید و در عین حال بخشی از آن را ویرایش کنید، حالت “r+” گزینه‌ی مناسبی است.به‌عنوان نمونه زمانی که می‌خواهید فقط یک عدد یا مقدار خاص را در فایل به‌روزرسانی نمایید،
یا وقتی که فقط بخش کوچکی از متن نیاز به ویرایش دارد، بدون اینکه کل فایل پاک شود یا از ابتدا نوشته شود.

حالت ‘w+’ – نوشتن و خواندن (پاک‌سازی محتوا)

بدین معناست که فایل مورد نظر را برای خواندن و نوشتن به‌صورت هم‌زمان باز می‌کنند.

				
					
open("text.txt", "w+")

				
			

ویژگی‌های اصلی حالت “w+”:

اجازه می‌دهند در فایل بنویسند و همچنین محتوای آن را بخوانند.
اگر فایل وجود نداشته باشد، به‌صورت خودکار آن را ایجاد می‌کنند.

اگر فایل از قبل وجود داشته باشد، تمام محتوای آن را حذف می‌کنند.
بنابراین، هنگام استفاده از “w+”، چه فایل وجود داشته باشد چه نه، با فایلی خالی مواجه خواهید شد و عملیات نوشتن از ابتدا آغاز می‌شود.

				
					with open("example.txt", "r", encoding="utf-8") as f:
        print(f.readline(4))

				
			

متد seek() در پایتون برای تغییر موقعیت مکان‌نما (cursor) در فایل استفاده می‌شود.
این موقعیت مشخص می‌کند که عملیات خواندن یا نوشتن بعدی از کدام نقطه در فایل آغاز شود.

 فایل‌ CSV در پایتون

فایل CSV در پایتون (متن جداشده با کاما) برای ذخیره جدول‌های داده کاربرد دارد. پایتون،، ماژول csv را دارد که خواندن/نوشتن  فایل CSV در پایتون  را ساده می‌کند. هنگام کار با CSV معمولاً فایل را با newline=” و غالباً با encoding=’utf-8′ باز می‌کنیم تا مشکلات یونیکد حل شود.

خواندن فایلCSV در پایتون با csv.reader: ابتدا import csv را فراموش نکنید. سپس فایل را باز کنید و csv.reader را ایجاد کنید.

فرض کنید فایل employees.csv چنین محتوایی داشته باشه:

				
					Name,Department,Salary
Ali,Engineering,50000
Sara,HR,45000
Reza,Marketing,48000

				
			

ابتدا import csv را فراموش نکنید. سپس فایل را باز کنید و csv.reader را ایجاد کنید.

				
					 import csv
with open('employees.csv', 'r', encoding='utf-8', newline='') as csv_file:
        reader = csv.reader(csv_file, delimiter=',', quotechar='"')
        for row in reader:
            print(row)  
				
			

خروجی برنامه : هر ردیف به صورت یک لیست چاپ می‌شه و مقادیر داخل سلول‌ها از هم جدا شده‌اند.

				
					['Name', 'Department', 'Salary']
['Ali', 'Engineering', '50000']
['Sara', 'HR', '45000']
['Reza', 'Marketing', '48000']

				
			

 در این مثال delimiter=’,’ تعیین می‌کند ستون‌ها با کاما جدا شده‌اند. اگر جداکننده دیگری داریم، می‌توانیم آن را تغییر دهیم (مثلاً delimiter=’;’). quotechar='”‘ تعیین می‌کند که فیلدهای شامل کاما داخل چه کاراکتری نقل قول شوند. خروجی هر row یک لیست از رشته‌هاست.

خواندن CSV با csv.DictReader: برای دسترسی راحت‌تر می‌توانیم از DictReader استفاده کنیم که هر سطر را به دیکشنری تبدیل می‌کند. کلیدها از اولین سطر (سرستون‌ها) گرفته می‌شوند. مثال:

				
					name,department,birthday
Ali,Engineering,1990-01-15
Sara,HR,1988-09-20
Reza,Marketing,1992-05-12

				
			
				
					 import csv
with open('employees.csv', 'r', encoding='utf-8', newline='') as csv_file:
        reader = csv.DictReader(csv_file)
        for row in reader:
             print(row['name'], row['department'], row['birthday'])

				
			

خروجی برنامه : اینجا row یک دیکشنری است و کلیدها (مثل ‘name’, ‘department’) از سطر اول فایل گرفته می‌شوند. اگر فایل CSV سرستون نداشته باشد، می‌توان با پارامتر fieldnames=[‘col1′,’col2’,…] لیست کلیدها را مشخص کرد.

				
					Ali Engineering 1990-01-15
Sara HR 1988-09-20
Reza Marketing 1992-05-12

				
			

اگر نام ستون‌ها در CSV چیز دیگری باشد (مثلاً Name به جای name)، برنامه خطا می‌دهد:

				
					KeyError: 'name'

				
			

نوشتن فایل csv در پایتون با csv.writer:

ابتدا فایل را با حالت نوشتن باز کنید (همچنین newline=” و encoding مناسب). سپس با csv.writer یک شیء نویسنده می‌سازیم:

				
					 import csv
rows = [
    ['name', 'department', 'birthday'],
    ['Ali', 'Sales', 'Jan'],
    ['Sara', 'HR', 'Feb']
]
with open('output.csv', 'w', encoding='utf-8', newline='') as csv_file:
        writer = csv.writer(csv_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        for row in rows:
            writer.writerow(row)

				
			

خروجی کد:

				
					name,department,birthday
Ali,Sales,Jan
Sara,HR,Feb

				
			

 این کد سه سطر را به صورت جدول CSV می‌نویسد. delimiter و quotechar مشابه قبل است و quoting=csv.QUOTE_MINIMAL بیان می‌کند تنها وقتی نیاز است فیلدها را در نقل‌قول قرار بدهد. می‌توان از writer.writerows(rows) نیز استفاده کرد تا همه سطرها یکجا نوشته شوند.
نوشتن CSV با csv.DictWriter: اگر داده ما در قالب دیکشنری است، DictWriter مفید است. مثال:

				
					 import csv
fieldnames = ['name', 'department', 'birthday']
with open('dict_output.csv', 'w', encoding='utf-8', newline='') as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    writer.writeheader()  # نوشتن هدر ها
    writer.writerow({'name':'Ali', 'department':'Sales', 'birthday':'Jan'})
    writer.writerow({'name':'Sara', 'department':'HR', 'birthday':'Feb'})

				
			

خروجی کد:

				
					name,department,birthday
Ali,Sales,Jan
Sara,HR,Feb

				
			

writer.writerow(row) هر سطر از لیست rows رو جدا جدا به فایل می‌نویسه.
,=delimiter یعنی ستون‌ها با کاما جدا می‌شن.
=quotechar یعنی اگر لازم شد، مقادیر بین دابل‌کوتیشن گذاشته می‌شن (مثلاً اگر مقدار خودش کاما داشته باشه).
quoting=csv.QUOTE_MINIMAL یعنی فقط وقتی مقدار نیاز به نقل‌قول داشته باشه، از ” استفاده می‌کنه (مثلاً وقتی داخل مقدار کاما باشه).

 اینجا کلیدهای دیکشنری باید مطابق لیست fieldnames باشد.
مدیریت یونیکد و پارامترهای اضافی: برای پشتیبانی از حروف فارسی یا سایر یونیکدها، حتماً فایل را با encoding=’utf-8 باز کنید. همچنین توصیه می‌شود هنگام کار با فایل csv در پایتون همواره از =newline استفاده کنید تا از ایجاد خطوط خالی اضافی جلوگیری شود.

خواندن و نوشتن فایل  JSON در پایتون

ماژول استاندارد json در پایتون برای کار با فایل JSON (فرمت متنی شناخته‌شده برای تبادل داده) استفاده می‌شود.

نوشتن JSON: برای نوشتن داده پایتون به فایل JSON از json.dump(obj, file) استفاده می‌کنیم. به طور مثال:

				
					import json

data = {'name': 'Ali', 'age': 30, 'languages': ['Python', 'C++']}

with open('data.json', 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4, sort_keys=True)

				
			

خروجی فایل data.json:

				
					{
    "age": 30,
    "languages": [
        "Python",
        "C++"
    ],
    "name": "Ali"
}

				
			

 این کد دیکشنری data را در فایل data.json می‌نویسد. 

indent=4 باعث مرتب و فاصله‌گذاری خوانا می‌شود (۶ پارامتر ایجاد می‌کند). اگر indent را None یا حذف کنیم، خروجی در یک خط فشرده می‌شود.

با ensure_ascii=False می‌توانیم کاراکترهای غیر ASCII (مثل حروف فارسی) را به همان صورت در خروجی نگه داریم؛ در حالت پیش‌فرض (True)، این کاراکترها به شکل \uXXXX فرمت می‌شوند. با sort_keys=True کلیدهای دیکشنری بر اساس ترتیب حروف الفبا مرتب می‌شوند که برای مقایسه‌ها و تست مفید است.

خواندن JSON از فایل: برای خواندن، فایل را باز کرده و از json.load(file) استفاده می‌کنیم. مثال:

 محتوای data.json:

				
					{
    "age": 30,
    "languages": [
        "Python",
        "C++"
    ],
    "name": "Ali"
}

				
			
				
					import json
with open('data.json', 'r', encoding='utf-8') as f:
        obj = json.load(f)
print(obj['name'], obj['age'])

				
			

خروجی:

				
					Ali 30

				
			

 این دستور محتویات JSON را به یک آبجکت پایتون (معمولاً دیکشنری یا لیست) تبدیل می‌کند. تفاوت json.load و json.loads در منبع داده است: load از فایل (text یا binary) می‌خواند و loads از رشته (JSON در حافظه). به‌عنوان قاعده کلی، وقتی داده JSON را قبلاً در یک رشته داریم از json.loads استفاده می‌کنیم، و برای فایل از json.load استفاده می‌کنیم.

نکته:اگر کلید name یا age در فایل موجود نباشد، برنامه خطای KeyError می‌دهد.
برای اطمینان بیشتر، می‌توانی از .get() استفاده کنید:

				
					print(obj.get('name', 'نام موجود نیست'), obj.get('age', 'سن مشخص نیست'))

				
			

اینطوری اگر کلید نباشد، پیغام جایگزین نشان داده می‌شود و برنامه دچار  مشکل نمی شود.

موارد خاص JSON: JSON فرمت متنی است، اما اگر بخواهیم در حالت باینری بنویسیم، می‌توانیم فایل را با ‘wb’ باز و json.dump را مستقیماً در فایل باینری بنویسیم (در این حالت خروجی بایت خواهد بود). پارامترهای encoding برای json.dump وجود ندارد؛ باید از پارامتر encoding در ()open برای کنترل انکدینگ فایل استفاده کنیم. مثال‌های بالا با انکدینگ UTF-8 و ensure_ascii=False نشان می‌دهند که رشته‌های یونیکد مانند فارسی صحیح نوشته می‌شوند.

نوشتن JSON در فایل به‌صورت باینری:

				
					

data = {
    'نام': 'علی',
    'سن': ۳۰,
    'زبان‌ها': ['پایتون', '++C']
}


json_bytes = json.dumps(data, ensure_ascii=False, indent=4, sort_keys=True).encode('utf-8')

# نوشتن در فایل به صورت باینری
with open('data_binary.json', 'wb') as f:
        f.write(json_bytes)

				
			

خواندن فایل باینری JSON:

				
					with open('data_binary.json', 'rb') as f:
        json_text = f.read().decode('utf-8')  # تبدیل از بایت به رشته

data = json.loads(json_text)
print(data['نام'], data['سن'])

				
			
نوشته های مرتبط

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *