وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

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

0 32
زمان لازم برای مطالعه: 7 دقیقه


معرفی

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

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

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

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

ساخته شده در open() تابع همان چیزی است که برای باز کردن a استفاده می کنید شی فایل برای اهداف خواندن یا نوشتن در اینجا روش استفاده از آن برای باز کردن یک فایل آمده است:

fp = open('path/to/file.txt', 'r')

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

حالت

شرح

r برای خواندن متن ساده باز کنید
w برای نوشتن متن ساده باز کنید
a یک فایل موجود را برای اضافه کردن متن ساده باز کنید
rb برای خواندن داده های باینری باز کنید
wb برای نوشتن داده های باینری باز کنید

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

fp.close()

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

در حالی که همیشه می توانید به یاد داشته باشید که تماس بگیرید close() روی یک شی فایل، یک راه جایگزین و زیباتر برای باز کردن یک شی فایل و اطمینان از پاکسازی مفسر پایتون پس از استفاده وجود دارد:

with open('path/to/file.txt') as fp:
    

به سادگی با استفاده از with کلمه کلیدی (معرفی شده در پایتون 2.5) به کدی که برای باز کردن یک شی فایل استفاده می کنیم، پایتون کاری مشابه کد زیر انجام می دهد. این تضمین می کند که مهم نیست که شی فایل پس از استفاده بسته می شود:

try:
    fp = open('path/to/file.txt')
    
finally:
    fp.close()

هر یک از این دو روش مناسب است، مثال اول بیشتر پایتونیک است.

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

توجه داشته باشید: در ادامه این مقاله با متن کتاب “ایلیاد هومر” کار خواهیم کرد که در آدرس زیر قابل مشاهده است. gutenberg.orgو همچنین در مخزن GitHub که کد مربوط به این مقاله است.

خواندن خط به خط یک فایل در پایتون با readline()

بیایید با readline() متد، که یک خط را می خواند، که ما را ملزم به استفاده از شمارنده و افزایش آن می کند:

filepath = 'Iliad.txt'
with open(filepath) as fp:
   line = fp.readline()
   cnt = 1
   while line:
       print("Line {}: {}".format(cnt, line.strip()))
       line = fp.readline()
       cnt += 1

این قطعه کد یک شی فایل را باز می کند که مرجع آن در آن ذخیره می شود fp، سپس با تماس در یک خط یک به یک می خواند readline() روی آن فایل به صورت تکراری در a while حلقه سپس خط را به سادگی چاپ می کند console.

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

...
Line 567: exceedingly trifling. We have no remaining inscription earlier than the
Line 568: fortieth Olympiad, and the early inscriptions are rude and unskilfully
Line 569: executed; nor can we even assure ourselves whether Archilochus, Simonides
Line 570: of Amorgus, Kallinus, Tyrtaeus, Xanthus, and the other early elegiac and
Line 571: lyric poets, committed their compositions to writing, or at what time the
Line 572: practice of doing so became familiar. The first positive ground which
Line 573: authorizes us to presume the existence of a manuscript of Homer, is in the
Line 574: famous ordinance of Solon, with regard to the rhapsodies at the
Line 575: Panathenaea: but for what length of time previously manuscripts had
Line 576: existed, we are unable to say.
...

اگرچه، این رویکرد است خام و صریح. مطمئناً خیلی پایتونیک نیست. می توانیم از آن استفاده کنیم readlines() روشی برای اینکه این کد بسیار مختصرتر شود.

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

این readlines() روش می خواند تمام خطوط و آنها را در یک ذخیره می کند List. سپس می توانیم روی آن لیست تکرار کرده و از آن استفاده کنیم enumerate()، برای راحتی ما برای هر خط یک فهرست ایجاد کنید:

file = open('Iliad.txt', 'r')
lines = file.readlines()

for index, line in enumerate(lines):
    print("Line {}: {}".format(index, line.strip()))
    
file.close()

این نتیجه در:

...
Line 160: INTRODUCTION.
Line 161:
Line 162:
Line 163: Scepticism is as much the result of knowledge, as knowledge is of
Line 164: scepticism. To be content with what we at present know, is, for the most
Line 165: part, to shut our ears against conviction; since, from the very gradual
Line 166: character of our education, we must continually forget, and emancipate
Line 167: ourselves from, knowledge previously acquired; we must set aside old
Line 168: notions and embrace fresh ones; and, as we learn, we must be daily
Line 169: unlearning something which it has cost us no small labour and anxiety to
Line 170: acquire.
...

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

خواندن یک فایل خط به خط با a برای حلقه – پایتونیک ترین رویکرد

بازگشته File خود تکرارپذیر است. ما نیازی به استخراج خطوط از طریق نداریم readlines() اصلاً – ما می توانیم خود شیء برگشتی را تکرار کنیم. این کار را نیز آسان می کند enumerate() بنابراین می توانیم شماره خط را در هر کدام بنویسیم print() بیانیه.

این کوتاه‌ترین و پایتونیک‌ترین رویکرد برای حل مشکل است و رویکردی که بیشتر مورد علاقه است:

with open('Iliad.txt') as f:
    for index, line in enumerate(f):
        print("Line {}: {}".format(index, line.strip()))

این نتیجه در:

...
Line 277: Mentes, from Leucadia, the modern Santa Maura, who evinced a knowledge and
Line 278: intelligence rarely found in those times, persuaded Melesigenes to close
Line 279: his school, and accompany him روی his travels. He promised not only to pay
Line 280: his expenses, but to furnish him with a further stipend, urging, that,
Line 281: "While he was yet young, it was fitting that he should see with his own
Line 282: eyes the countries and cities which might hereafter be the subjects of his
Line 283: discourses." Melesigenes consented, and set out with his patron,
Line 284: "examining all the curiosities of the countries they visited, and
...

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

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

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

import sys
import os

def main():
   filepath = sys.argv(1)
   if not os.path.isfile(filepath):
       print("File path {} does not exist. Exiting...".format(filepath))
       sys.exit()
  
   bag_of_words = {}
   with open(filepath) as fp:
       for line in fp:
           record_word_cnt(line.strip().split(' '), bag_of_words)
   sorted_words = order_bag_of_words(bag_of_words, desc=True)
   print("Most frequent 10 words {}".format(sorted_words(:10)))
  
def order_bag_of_words(bag_of_words, desc=False):
   words = ((word, cnt) for word, cnt in bag_of_words.items())
   return sorted(words, key=lambda x: x(1), reverse=desc)

def record_word_cnt(words, bag_of_words):
    for word in words:
        if word != '':
            if word.lower() in bag_of_words:
                bag_of_words(word.lower()) += 1
            else:
                bag_of_words(word.lower()) = 1

if __name__ == '__main__':
    main()

اسکریپت از os ماژول برای اطمینان از وجود فایلی که می خواهیم بخوانیم. اگر چنین است، خط به خط خوانده می شود و هر خط ارسال می شود روی به درون record_word_cnt() تابع. فاصله بین کلمات را مشخص می کند و کلمه را به فرهنگ لغت اضافه می کند – bag_of_words. هنگامی که تمام خطوط در فرهنگ لغت ثبت شد، آن را از طریق سفارش می دهیم order_bag_of_words() که لیستی از تاپل ها را برمی گرداند (word, word_count) قالب، مرتب شده بر اساس تعداد کلمات.

بالاخره ما print ده کلمه رایج

به طور معمول، برای این کار، با استفاده از کتابخانه هایی مانند NLTK، یک مدل Bag of Words ایجاد می کنید، هرچند، این پیاده سازی کافی است. بیایید اسکریپت را اجرا کنیم و ما را ارائه کنیم Iliad.txt به آن:

$ python app.py Iliad.txt

این نتیجه در:

Most frequent 10 words (('the', 15633), ('and', 6959), ('of', 5237), ('to', 4449), ('his', 3440), ('in', 3158), ('with', 2445), ('a', 2297), ('he', 1635), ('from', 1418))

نتیجه

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

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-02 02:08:04

امتیاز شما به این مطلب
پیشنهاد می‌کنیم بخوانید:  append() vs extend() vs insert() در لیست های پایتون
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید