خواندن فایل ها با پایتون

معرفی

برای کار با داده های ذخیره شده، مدیریت فایل به دانش اصلی هر برنامه نویس حرفه ای پایتون تبدیل می شود. درست از اولین انتشار آن، خواندن و نوشتن داده ها در فایل ها از ویژگی های داخلی پایتون هستند. در مقایسه با سایر زبان های برنامه نویسی مانند C یا جاوا، بسیار ساده است و تنها به چند خط کد نیاز دارد. علاوه بر این، هیچ ماژول اضافی برای انجام این کار به درستی لازم نیست بارگذاری شود.

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

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

روش های رایج برای کار با فایل ها عبارتند از open() برای باز کردن یک فایل، seek() برای تنظیم موقعیت فعلی فایل در افست داده شده، و close() برای بستن شی فایل پس از اتمام استفاده از آن. ساخته شده در open() تابع یک دسته فایل را برمی گرداند که نشان دهنده یک شی فایل است که برای دسترسی به فایل برای خواندن، نوشتن یا الحاق استفاده می شود.

هنگام باز کردن یک فایل برای خواندن، پایتون باید دقیقا بداند که چگونه فایل باید با سیستم باز شود. دو حالت دسترسی در دسترس است - خواندن و خواندن در حالت باینری. پرچم های مربوطه استفاده می شود 'r'و 'rb'، و باید هنگام باز کردن یک فایل با داخلی مشخص شود open() عملکرد. حالت اول شامل تفسیر کاراکترهای ویژه مانند "CR" (بازگشت حمل) و "LF" (فید خط) برای نشان دادن شکست خط است، در حالی که حالت باینری به شما امکان می دهد داده ها را در حالت خام بخوانید - جایی که داده ها به همان صورت ذخیره می شوند. بدون تفسیر بیشتر

هنگامی که یک فایل را باز کردید، open() تابع یک شی فایل را به شما برمی گرداند. این اشیاء فایل دارای روش هایی مانند read(), readline(), write(), tell()و seek(). در حالی که برخی از اشیاء فایل (یا اشیای فایل مانند) روش های بیشتری نسبت به موارد ذکر شده در اینجا دارند، اینها رایج ترین هستند. همه اشیاء فایل نیازی به پیاده سازی همه روش های فایل ندارند.

خواندن یک فایل خط به خط

مثال اول از دو زبان برنامه نویسی C و C++ الهام گرفته شده است. این احتمالا بصری ترین رویکرد است - فایل را با استفاده از باز کردن open() عملکرد، فایل را خط به خط بخوانید با استفاده از readline() روش، و خروجی خط بلافاصله پس از خواندن.

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


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

همانطور که ممکن است متوجه شده باشید، ما به صراحت فایل را در این مثال باز و بسته کرده ایم. اگرچه مفسر پایتون فایل های باز شده را به طور خودکار در پایان اجرای برنامه پایتون می بندد، اما به صراحت فایل را از طریق می بندد. close() یک سبک برنامه نویسی خوب است و نباید فراموش شود.

به عنوان یک بهبود، پروتکل تکرار کننده راحت در پایتون 2.3 معرفی شد. این به شما این امکان را می دهد که ساده سازی کنید readline حلقه:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

مورد استفاده در اینجا یک است for حلقه در ترکیب با in اشاره گر. خط فعلی با کمک شناسایی می شود in iterator، از فایل خوانده می شود و محتوای آن به خروجی می رود stdout. پایتون باز و بسته شدن فایل را زمانی که از محدوده خارج می شود برای شما پوشش می دهد. در حالی که ناکارآمد است، به شما این امکان را می دهد که دیگر با دسته فایل ها سر و کار نداشته باشید.

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

معرفی شده در پایتون 2.5، with دستور کل فرآیند را حتی بیشتر محصور می کند و همچنین باز و بسته شدن فایل ها را فقط یک بار در سراسر بلوک کد محدوده انجام می دهد:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

ترکیبی از with بیانیه و open() دستور فقط یک بار فایل را باز می کند. در صورت موفقیت آمیز بودن for حلقه اجرا می شود و محتوای خط روی آن چاپ می شود stdout.

علاوه بر این، استفاده از with بیانیه یک اثر جانبی دارد در داخل، مفسر پایتون a را ایجاد می کند try-finally-بلاک برای محصور کردن خواندن از فایل. مثال زیر نشان می‌دهد که اساساً در پایتون چه اتفاقی می‌افتد with بلوک های کد:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

خواندن یک فایل به صورت تکه‌های خطوط

تا به حال یک فایل را خط به خط پردازش کرده ایم. این برای فایل‌های بزرگ بسیار کند است و می‌توان با خواندن چندین خط به طور همزمان آن را بهبود بخشید. برای رسیدن به آن، islice() روش از itertools ماژول وارد بازی می شود. همچنین، به عنوان یک تکرار کننده کار می کند و تکه ای از داده ها را برمی گرداند n خطوط در پایان فایل، نتیجه ممکن است کوتاهتر باشد، و در نهایت، تماس یک لیست خالی برمی گرداند:

from itertools import islice

filename = "test.txt"

number_of_lines = 5

with open(filename, 'r') as input_file:
    lines_cache = islice(input_file, number_of_lines)
   
    for current_line in lines_cache:
        print (current_line)

خواندن یک خط خاص از یک فایل

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


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

درک این موضوع باید ساده باشد، اما کمی طولانی تر از نمونه های قبلی است. می توان آن را با استفاده از کش خطی ماژول

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


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

خواندن کل فایل یکباره

آخرین اما نه کم اهمیت، ما نگاهی به یک مورد بسیار متفاوت از مثال قبلی خواهیم داشت – خواندن کل فایل در یک حرکت.

به خاطر داشته باشید که در بیشتر موارد باید حافظه کافی برای خواندن کل فایل داشته باشید، زیرا کاراکترها فضای زیادی را اشغال نمی کنند، اما از فایل های حجیم خسته باشید. مثال زیر از ترکیبی از with بیانیه، و read() روش. در این صورت استفاده خواهیم کرد read() برای بارگیری محتوای فایل به عنوان یک جریان داده:

راهنمای عملی و عملی ما برای یادگیری Git را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

پایتون نیز ارائه می دهد readlines() روش، که شبیه به readline() روش از مثال اول در مقابل read()، محتوای فایل در یک لیست ذخیره می شود که در آن هر خط از محتوا یک آیتم است:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

در حالی که readlines() محتوا را از فایل می خواند تا زمانی که به EOF برسد، به خاطر داشته باشید که با ارائه sizehint پارامتر، که تعداد بایت هایی برای خواندن است.

نتیجه

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

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

تمبر زمان:

بیشتر از Stackabuse