کار کردن با محتویّات یک فایل

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
filename = 'pi_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()

pi_string = ''
for line in lines:
    pi_string += line.rstrip()

print(pi_string)
print(len(pi_string))

مشابه کاری که در مثال قبل کردیم، فایل را باز می‌کنیم و هر خط از رقم‌ها را در یک لیست ذخیره می‌کنیم. در ۱ متغیّر pi_string را می‌سازیم تا رقم‌های pi را دربربگیرد. سپس حلقه‌ای ایجاد می‌کنیم که هر خطّ از رقم‌ها را به pi_string افزوده و کاراکتر خطّ جدید را از هر خط حذف می‌کند (۲). در ۳ رشته را چاپ می‌کنیم و طول آن را نمایش می‌دهیم:

1
2
3
3.1415926535    8979323846    2643383279

36

متغیّر pi_string شامل فاصله‌هایی است که در سمت چپ رقم‌های هر خط وجود دارد، امّا می‌توانیم با به‌کارگیری strip() به جای rstrip() از شرّ آن‌ها خلاص شویم:

1
2
3
4
5
6
7
--snip--

for line in lines:
    pi_string += line.strip()

print(pi_string)
print(len(pi_string))

حال رشته‌ای داریم که عدد پی را تا ۳۰ رقم اعشار دربرمی‌گیرد. رشته ۳۲ حرف است چون علاوه بر رقم‌های اعشار عدد ۳ و علامت اعشار را هم در خود دارد:

1
2
3
3.141592653589793238462643383279

32
نکته
زمانی که پایتون فایلی متنی را می‌خواند تمام متن آن را به عنوان رشته در نظر می‌گیرد. اگر مقداری عددی را خوانده‌اید و می‌خواهید با آن محاسبات عددی انجام دهید، باید آن را به کمک تابع int() به عدد صحیح یا به کمک تابع float() به عدد اعشاری تبدیل کنید.

فایل‌های بزرگ: یک میلیون رقم اعشار

تا اینجا بر روی تحلیل فایلی متنی تمرکز کرده‌ایم که تنها سه خط را شامل می‌شد امّا کد این مثال‌ها می‌توانند با فایل‌های بسیار بزرگ‌تر هم به خوبی کار کنند. اگر با فایلی متنی شروع کنیم که به جای ۳۰ رقم، عدد پی را تا یک میلیون رقم اعشار داشته باشد، می‌توانیم رشته‌ای بسازیم که تمام این رقم‌ها را دربربگیرد. نیاز به ایجاد هیچ تغییری در برنامه نیست به جز این که نام فایل ورودی را عوض کنیم. ما همچنین فقط ۵۰ رقم اوّل را چاپ می‌کنیم تا نیاز نباشد یک میلیون رقم را در ترمینال ببینیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
filename = 'pi_million_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()

pi_string = ''
for line in lines:
    pi_string += line.strip()

print(f"{pi_string[:52]}...")
print(len(pi_string))

خروجی نشان می‌دهد که رشته‌ای از عدد پی تا یک میلیون رقم اعشار داریم:

1
2
3
3.14159265358979323846264338327950288419716939937510...

1000002

پایتون هیچ نوع محدودیّت ذاتی برای حجم داده‌ای که می‌خواهید با آن کار کنید، ندارد؛ می‌توانید با هر چه‌قدر داده که حافظه‌ی سیستم شما می‌تواند در خود جا دهد کار کنید.

نکته
برای اجرا کردن این برنامه (و بسیاری از مثال‌هایی که از این پس می‌آیند) باید منابع موجود در https://nostarch.com/pythoncrashcourse2e را دریافت کنید.

آیا تاریخ تولّد شما در عدد پی وجود دارد؟

من همیشه کنجکاو بوده‌ام که بدانم آیا تاریخ تولّدم در جایی از رقم‌های عدد پی وجود دارد یا نه. بیایید از برنامه‌ای که الان نوشتیم استفاده کنیم تا ببینیم تاریخ تولّد فرد در یک میلیون رقم اعشار اوّل عدد پی وجود دارد یا نه. این کار را می‌توانیم با بیان روز تولّد هر کس به صورت یک رشته و سپس جست‌و‌جوی آن رشته در pi_string انجام دهیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
--snip--

for line in lines:
    pi_string += line.strip()

birthday = input("Enter your birthday, in the form mmddyy: ")

if birthday in pi_string:
    print("Your birthday appears in the first million digits of pi!")
else:
    print("Your birthday does not appear in the first million digits of pi.")

در ۱ از کاربر می‌خواهیم که تاریخ تولّد خود را وارد کند و در ۲ بررسی می‌کنیم که آیا آن رشته در pi_string وجود دارد یا نه. آن را امتحان می‌کنیم:

1
2
3
Enter your birthdate, in the form mmddyy: 120372

Your birthday appears in the first million digits of pi!

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