دوره H برنامه نویسی پایتون
فصل چهارم: استثناها و فایل ها در پایتون
درس چهارم: کار با فایل ها در پایتون
در این درس میخواهیم نحوهی کار با فایلها را یاد بگیریم. یعنی بتوانیم فایلی را باز کرده و محتوایش را بخوانیم، در آن تغییر دهیم و موارد دیگر …! 🙂
1. باز کردن فایل در پایتون
طبیعتا فایلهای متنی برای دستکاری، سادهتر هستند. قبل از اینکه بتوان داخل فایلی چیزی نوشت و یا آن را تغییر داد، ابتدا بایستی آن را باز کرد؛ که این کار در پایتون، توسط تابع open انجام میشود. بصورت زیر:
1 |
myfile = open("filename.txt") |
فایلی با نام finename.txt، از حافظه باز شده و در متغیر myfile قرار میگیرد. حالا از طریق myfile میتوان با این فایل کار کرد. 🙂
تعیین مد یا حالت باز کردن فایل
میتوان حالت باز شدن یک فایل را، با تعیین پارامتر دوم تابعِ open مشخص کرد. این حالت، میتواند شامل مقادیر زیر باشد:
- “r”: فایل را در حالت فقط خواندنی باز میکند؛ که حالت پیشفرض است.
- “w”: فایل را در حالت فقط نوشتنی باز میکند؛ یعنی بتوان محتوای درون آن را تغییر داد.
- “a”: فایل را در حالت append باز میکند؛ بدین معنا که میتوان محتوای جدیدی را به انتهای آن اضافه کرد. (همانند نوشتن است ولی کل محتوای فایل را تغییر نمیدهد)
- “b”: فایل را در حالت باینری باز میکند؛ که برای فایلهای غیرمتنی استفاده میشود. (مانند تصاویر و فایلهای صوتی)
برای مثال:
1 2 3 4 5 6 7 8 9 |
# write mode open("filename.txt", "w") # read mode open("filename.txt", "r") open("filename.txt") # binary write mode open("filename.txt", "wb") |
در حالت wb، یعنی اینکه فایل را بصورت باینری باز کند بعلاوه اینکه بتوان محتوای آن را تغییر داد!
بستن فایل باز شده
پس از اینکه فایلی را باز کردیم و از آن استفاده نمودیم، بایستی حتما آن را ببندیم تا منابع سیستم آزاد شود. این کار توسط متد close انجام میگیرد:
1 2 3 |
file = open("filename.txt", "w") # کارهای مربوط به پرونده را انجام دهید file.close() |
2. خواندن فایل در پایتون
پس از باز کردن فایل، میتوان محتوای آن را خواند! البته اگر فایل با چنین حالتی باز شده باشد. 🙂
برای خواندن محتوای فایل، از متد read استفاده میشود. بصورت زیر:
1 2 3 4 |
file = open("filename.txt", "r") cont = file.read() print(cont) file.close() |
این کد، تمامی محتوای فایل را در متغیر cont ریخته و سپس آن را پرینت میکند. 😐
خواندن بخشی از فایل
اما برای خواندن مقدار مشخصی از یک فایل، میتوان عددی را به عنوان آرگومان ورودی برای متد read در نظر گرفت. این عدد، تعداد بایتهایی که قرار است خوانده شود را تعیین میکند!
شما میتوانید مقدارهای بیشتری از فایل را با فراخوانی مکرر read پشت سرهم و بصورت بایت بایت بخوانید (یعنی هربار، از بقیهی مقداری که مانده به شما برگردانده میشود). و اگر در نهایت این متد را بدون مقدار فراخوانی کنید، بقیه محتوای فایل تا انتها برایتان برگردانده میشود!
1 2 3 4 5 6 |
file = open("filename.txt", "r") print(file.read(16)) print(file.read(4)) print(file.read(4)) print(file.read()) file.close() |
پس از خواندن فایل
پس از اینکه فایل بصورت کامل خوانده شد، هرگونه تلاش اضافهای برای خواندن آن، یک رشتهی خالی را برمیگرداند.
1 2 3 4 5 6 |
file = open("filename.txt", "r") file.read() print("Re-reading") print(file.read()) print("Finished") file.close() |
خروجی:
1 2 3 4 5 |
>>> Re-reading Finished >>> |
خط به خط در لیست
برای اینکه محتوای فایل خوانده شده (در صورت متنی بودن) بصورت خط به خط در یک لیست قرار گرفته و برگدانده شود، میتوان از متد readlines استفاده کرد. مثلا بصورت زیر:
1 2 3 |
file = open("filename.txt", "r") print(file.readlines()) file.close() |
خروجی میتواند به شکل زیر باشد:
1 2 3 |
>>> ['Line 1 text \n', 'Line 2 text \n', 'Line 3 text'] >>> |
همچنین میتوان از یک حلقهی for، برای پیمایش خطوط استفاده کرد:
1 2 3 4 5 6 |
file = open("filename.txt", "r") for line in file: print(line) file.close() |
خروجی میتواند به شکل زیر باشد:
1 2 3 4 5 6 7 |
>>> Line 1 text Line 2 text Line 3 text >>> |
3. نوشتن فایلها
همیشه قرار نیست فایل خوانده شود و گاهی نیاز است که محتوایی درون آن نوشته شود! بدین منظور، از متد write استفاده میشود. مثلا بصورت زیر:
1 2 3 4 5 6 7 |
file = open("newfile.txt", "w") file.write("WWW.FuLLKade.COM") file.close() file = open("newfile.txt", "r") print(file.read()) file.close() |
خروجی:
1 2 3 |
>>> WWW.FuLLKade.COM >>> |
در اینجا، کد نوشته شده اصلا کاری به این ندارد که چه چیزی قبلا در فایل قرار داشته باشد! بلکه محتوای ارسال شده برای متد write را به صورت کامل داخل آن مینویسد!
همانطور که گفته شد، وقتی فایل در حالت نوشتن باز شود، محتوای داخل آن نیز پاک میشود! برای مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
file = open("newfile.txt", "r") print("Reading initial contents") print(file.read()) print("Finished") file.close() file = open("newfile.txt", "w") file.write("WWW.FuLLKad.COM") file.close() file = open("newfile.txt", "r") print("Reading new contents") print(file.read()) print("Finished") file.close() |
خروجی:
1 2 3 4 5 6 7 8 |
>>> Reading initial contents some initial text Finished Reading new contents WWW.FuLLKad.COM Finished >>> |
در این مثال میبینید که محتوای فایل جایگزین شده است! 🙂
خروجی متد write
متد write، در صورت موفقیت آمیز بودن، تعداد بایت نوشته شده را برمیگرداند.
1 2 3 4 5 |
msg = "WWW.FuLLKad.COM" file = open("newfile.txt", "w") amount_written = file.write(msg) print(amount_written) file.close() |
خروجی:
1 2 3 |
>>> 16 >>> |
4. اطمینان از بسته شدن فایل
قبلا در try except، گفتیم که یکی از کاربردهای finally، این است که از بسته شدن فایلها اطمینان داشته باشیم. چراکه وقتی کارمان با یک فایل تمام شد، بهتر است آن را ببندیم تا منابع سیستم آزاد شوند و از آنجایی که finally چه خطا رخ بدهد و چه ندهد در هرصورت اجرا میشود، بنابراین جای مناسبی است. برای مثال:
1 2 3 4 5 |
try: f = open("filename.txt") print(f.read()) finally: f.close() |
بنابراین در اینجا، فایل چه خطا رخ بدهد و چه ندهد، بسته خواهد شد. 🙂
راه جایگزین
راه دیگری برای این کار وجود دارد که از finally استفاده نکنیم! و آن راه استفاده از دستور with و as بصورت زیر میباشد:
1 2 |
with open("filename.txt") as f: print(f.read()) |
در اینجا، فایل در متغیر f قرار گرفته است و خود به خود پس از اتمام کار، بسته خواهد شد. همچنین کد بایستی در بدنهی with نوشته شود.
نظرات ثبت شده بدون دیدگاه