از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
خواندن فایل ها با پایتون
سرفصلهای مطلب
معرفی
برای کار با داده های ذخیره شده، مدیریت فایل به دانش اصلی هر برنامه نویس حرفه ای پایتون تبدیل می شود. درست از اولین انتشار آن، خواندن و نوشتن داده ها در فایل ها از ویژگی های داخلی پایتون هستند. در مقایسه با سایر زبان های برنامه نویسی مانند 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
دستور کل را کپسوله می کند process حتی بیشتر، و همچنین باز و بسته کردن فایل ها را فقط یک بار در سراسر بلوک کد محدوده کنترل می کند:
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)
خواندن یک خط خاص از یک فایل
با استفاده از روش های نشان داده شده در بالا، می توانیم اقدامات مفید دیگری مانند خواندن یک خط خاص از یک فایل را نیز انجام دهیم. برای این کار از یک شمارنده و استفاده می کنیم print خط مناسب زمانی که هنگام تکرار در فایل به آن می رسیم:
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()
برای بارگیری محتوای فایل به عنوان یک جریان داده:
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
پارامتر، که تعداد بایت هایی برای خواندن است.
نتیجه
طبق معمول، بیش از یک راه برای خواندن محتویات یک فایل وجود دارد. از نظر سرعت همگی کم و بیش در یک دسته قرار می گیرند. اینکه کدام راه حل برای شما بهتر کار می کند بستگی دارد روی مورد استفاده خاص شما ما فکر می کنیم بسیار مفید است که ببینیم چه چیزی ممکن است و سپس بهترین راه حل را انتخاب کنیم.
در حالی که پایتون تا حد زیادی ساده می کند process در مورد خواندن فایل ها، هنوز هم گاهی اوقات ممکن است مشکل باشد، در این صورت توصیه می کنم به شما نگاهی بیندازید اسناد رسمی پایتون برای اطلاعات بیشتر.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-03 15:35:03