فایل‌ها

اصلاح شده

2025-07-28

بازکردن فایل

ممکن است داده‌های ما از قبل در فایلی موجود باشد (دانلود فایل) ، در اینصورت باید بتوانیم آن را باز کنیم:

fhand = open('mbox.txt')
print(fhand)
<_io.TextIOWrapper name='mbox.txt' mode='r' encoding='UTF-8'>

اگر باز کردن موفقیت‌آمیز باشد، سیستم‌عامل یک handle برای فایل به ما برمی‌گرداند. handle، داده‌های واقعی موجود در فایل نیست، اما در عوض یک handle است که می‌توانیم برای خواندن داده‌ها از آن استفاده کنیم. اگر فایل درخواستی وجود داشته باشد و مجوزهای لازم برای خواندن فایل را داشته باشیم، به ما یک handle داده می شود.

اما چنانچه فایل وجود نداشته باشد، اجرای این دستور ناموفق خواهد بود و handle نخواهیم داشت:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'mbox.txt'

خواندن فایل

با بازکردن فایل، تنها یک handle در اختیار خواهیم داشت تا بتوانیم با استفاده از آن با فایل موردنظر کار کنیم. بنابریان برای خواندن فایل، می‌بایست با یک دستور حلقه for ساده، اقدام به خواندن فایل کنیم:

fhand = open('mbox.txt')
count = 0
for line in fhand:
    count = count + 1
print('Line Count:', count)
Line Count: 7

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

fhand = open('mbox.txt')
inp = fhand.read()
print(len(inp))
334
print(inp[:20])
From stephen.marquar

در این حالت بهتر است رشته خوانده شده از فایل را در یک متغیر ذخیره کنیم، چراکه با خواندن فایل بعدی به همین روش، محتویات فایل قبلی را از دست خواهیم داد، به همین دلیل ما از متغیر inp در دستورات فوق استفاده کردیم.

جستجو در فایل

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

fhand = open('mbox.txt')
count = 0
for line in fhand:
    line = line.rstrip()
    if line.startswith('From:'):
        print(line)
From: stephen.marquard@uct.ac.za

در این مثال، ما به دنبال کلمه 'From' هستیم.

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

انتخاب نام فایل

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

fname = input('Enter the file name: ')
fhand = open(fname)
count = 0
for line in fhand:
    if line.startswith('Subject:'):
        count = count + 1
print('There were', count, 'subject lines in', fname)
Enter the file name: mbox.txt
There were 1 subject lines in mbox.txt

استفاده از try، except و open

از کد قبل به خاطر داریم که ما به کاربر اجازه دادیم که نام فایل حود را برای بازکردن، انتخاب نماید. حال اگر کاربر ما چیزی را تایپ کند که نام فایل نیست چه؟ بنابراین باید تمهیداتی برای این کار بیاندیشیم، چرا که گذشته از اینکه بازکردن یک فایل غیرمرتبط برنامه را با خطا مواجه می‌کند، ممکن است فایلی که کاربر آن را انتخاب کرده، عمداً و یا سهواً برای برنامه ما ضرر داشته باشد. بنابراین ما با استفاده از دستورات try ، except و open این اتفاق را مدیریت می‌کنیم:

fname = input('Enter the file name: ')
try:
    fhand = open(fname)
except:
    print('File cannot be opened:', fname)
    exit()
count = 0
for line in fhand:
    if line.startswith('Subject:'):
      count = count + 1
print('There were', count, 'subject lines in', fname)
Enter the file name: otherfile.txt
File cannot be opened: otherfile.txt
There were 0 subject lines in otherfile.txt

همانطور که مشاهده می‌شود، تابع exit() درصورت اینکه کاربر چیزی غیر از فایل را درخواست داده باشد، برنامه ما از اجرا خارج می‌شود.

نوشتن در فایل

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

fout = open('output.txt', 'w')
print(fout)
<_io.TextIOWrapper name='output.txt' mode='w' encoding='UTF-8'>

در اینجا چنانچه فایل موردنظر وجود داشته باشد، فایل باز شده و آماده نوشتن می‌باشد: در واقع پارمتر ‘w’ این اجازه را صادر می‌کند. اما اگر فایل موجود نباشد، یک فایل جدید با نام ذکر شده، ایجاد می‌شود و آماده نوشتن خواهد بود.

مثلاً فرض کنیم می‌خواهیم متن زیر را در فایل بنویسیم:

This here's the wattle

کد لازم برای این کار، به شکل زیر خواهد بود:

line1 = "This here's the wattle,\n"
fout.write(line1)
24

و درنهایت اینکه وقتی کارمان با فایلی تمام شد، می‌بایست حتماً آن را ببندیم:

fout.close()