
কেন Python দিয়ে খরচের হিসাব রাখবেন
মাসের শেষে টাকা কোথায় গেল, এই প্রশ্নের উত্তর খুঁজতে অনেকেই ব্যাংক স্টেটমেন্ট, মোবাইল নোট এবং স্মৃতির ওপর নির্ভর করেন। ছোট একটি কমান্ড-লাইন প্রোগ্রাম সেই বিচ্ছিন্ন তথ্যকে একটি CSV ফাইলে সাজিয়ে রাখতে পারে। এই প্রকল্পে আমরা Python দিয়ে এমন একটি expense tracker বানাব, যেখানে প্রতিটি খরচের তারিখ, বর্ণনা, বিভাগ এবং পরিমাণ সংরক্ষিত হবে। প্রোগ্রামটি নতুন খরচ যোগ করবে, সব রেকর্ড দেখাবে এবং বিভাগভিত্তিক মোট হিসাব বের করবে।
এটি ইচ্ছাকৃতভাবে ছোট, কিন্তু খেলনা নয়। ফাইল তৈরি, ব্যবহারকারীর ইনপুট যাচাই, টাকার দশমিক নির্ভুলতা এবং CSV পড়া-লেখার বাস্তব কৌশল একসঙ্গে অনুশীলন করা যাবে। GUI, ডেটাবেস বা অতিরিক্ত প্যাকেজ না থাকায় শিক্ষার্থী নিজের কম্পিউটারে Python 3 থাকলেই শুরু করতে পারবেন। পরে একই ধারণাকে ওয়েব অ্যাপ, মোবাইল অ্যাপ অথবা SQLite-ভিত্তিক ব্যবস্থায় বিস্তৃত করা সম্ভব।
কী বানাব এবং কীভাবে কাজ করবে
আমাদের ফাইলটির নাম expense_tracker.py এবং ডেটা থাকবে expenses.csv নামে। চালানোর সময় প্রথম আর্গুমেন্ট হিসেবে add, list অথবা summary লিখতে হবে। add কমান্ড চারটি তথ্য চাইবে: তারিখ, বর্ণনা, বিভাগ এবং পরিমাণ। list প্রতিটি রেকর্ড টেবিলের মতো দেখাবে। summary একই বিভাগের খরচ যোগ করে বড় থেকে ছোট ক্রমে দেখাবে। CSV-র কলাম হবে date, description, category, amount।
প্রথমবার চালালে CSV না থাকলেও সমস্যা হবে না; প্রোগ্রাম নিজে শিরোনামসহ ফাইল তৈরি করবে। আমরা csv.DictWriter ব্যবহার করব, কারণ কলামের নাম ধরে ডিকশনারি লেখা পড়তে সহজ। CSV মডিউলের মানগুলো মূলত স্ট্রিং হিসেবে ফেরত দেয়, তাই হিসাব করার আগে প্রতিটি amount-কে Decimal-এ রূপান্তর করতে হবে। float এখানে এড়ানো হবে, কারণ ০.১-এর মতো দশমিক বাইনারি ভাসমান সংখ্যায় সব সময় নিখুঁতভাবে প্রকাশিত হয় না।
কেন Decimal গুরুত্বপূর্ণ
টাকার হিসাবের ক্ষেত্রে এক পয়সার পার্থক্যও বিভ্রান্তিকর হতে পারে। Decimal দশমিক সংখ্যাকে এমনভাবে পরিচালনা করে, যা মূল্য গণনার জন্য অনেক বেশি পূর্বানুমেয়। ইনপুটকে সরাসরি Decimal(text) বানালে ব্যবহারকারীর দেওয়া দশমিক রূপ সংরক্ষণ করা যায়। আমরা ফল দেখানোর সময় দুই ঘর দশমিক ব্যবহার করব এবং যোগফলের জন্যও একই ধরনের মান রাখব।
শুধু Decimal ব্যবহার করলেই সব ভুল বন্ধ হয় না। খালি ইনপুট, অক্ষর মেশানো ইনপুট, ঋণাত্মক সংখ্যা এবং NaN বা অসীমের মতো বিশেষ মান আলাদা করে আটকাতে হবে। এই জন্য Decimal.is_finite() পরীক্ষা করা হবে। তারপর শূন্যের চেয়ে বড় কি না দেখা হবে। ফলে 12.50 গ্রহণযোগ্য, কিন্তু 0, -4, abc, NaN এবং Infinity প্রত্যাখ্যাত হবে। ব্যবহারকারী ভুল করলে প্রোগ্রাম বন্ধ না হয়ে আবার ইনপুট চাইবে।
সম্পূর্ণ executable কোড
নিচের কোডটি expense_tracker.py নামে সংরক্ষণ করুন। এটি কেবল Python-এর standard library ব্যবহার করে, তাই কোনো pip install দরকার নেই। newline='' দিয়ে CSV ফাইল খোলা হয়েছে, যা বিভিন্ন অপারেটিং সিস্টেমে অতিরিক্ত ফাঁকা লাইন এড়াতে গুরুত্বপূর্ণ। encoding='utf-8-sig' ব্যবহার করায় বাংলা বর্ণনা Windows Excel-সহ সাধারণ স্প্রেডশিটে তুলনামূলকভাবে ভালোভাবে খোলা যায়।
from __future__ import annotations
import argparse
import csv
from collections import defaultdict
from datetime import date
from decimal import Decimal, InvalidOperation
from pathlib import Path
CSV_FILE = Path("expenses.csv")
FIELDNAMES = ["date", "description", "category", "amount"]
def ensure_csv_file(path: Path = CSV_FILE) -> None:
"""Create the CSV file with a header if it does not exist."""
if not path.exists():
with path.open("w", newline="", encoding="utf-8-sig") as file:
writer = csv.DictWriter(file, fieldnames=FIELDNAMES)
writer.writeheader()
def ask_nonempty(prompt: str) -> str:
"""Keep asking until the user enters non-whitespace text."""
while True:
value = input(prompt).strip()
if value:
return value
print("ইনপুট খালি রাখা যাবে না। আবার চেষ্টা করুন।")
def ask_date() -> str:
"""Read a real date and return it in ISO format."""
while True:
value = input("তারিখ (YYYY-MM-DD, খালি হলে আজ): ").strip()
if not value:
return date.today().isoformat()
try:
return date.fromisoformat(value).isoformat()
except ValueError:
print("তারিখের রূপ সঠিক নয়। যেমন: 2026-01-31")
def ask_positive_amount() -> Decimal:
"""Read a finite amount greater than zero."""
while True:
text = input("পরিমাণ: ").strip()
try:
amount = Decimal(text)
except InvalidOperation:
print("পরিমাণে শুধু বৈধ সংখ্যা লিখুন। যেমন: 125.50")
continue
if not amount.is_finite() or amount <= Decimal("0"):
print("পরিমাণ অবশ্যই শূন্যের চেয়ে বড় একটি সসীম সংখ্যা হতে হবে।")
continue
return amount.quantize(Decimal("0.01"))
def add_expense(path: Path = CSV_FILE) -> None:
ensure_csv_file(path)
record = {
"date": ask_date(),
"description": ask_nonempty("বর্ণনা: "),
"category": ask_nonempty("বিভাগ: "),
"amount": f"{ask_positive_amount():.2f}",
}
with path.open("a", newline="", encoding="utf-8-sig") as file:
writer = csv.DictWriter(file, fieldnames=FIELDNAMES)
writer.writerow(record)
print("খরচ সফলভাবে সংরক্ষণ হয়েছে।")
def read_expenses(path: Path = CSV_FILE) -> list[dict[str, str]]:
ensure_csv_file(path)
with path.open("r", newline="", encoding="utf-8-sig") as file:
return list(csv.DictReader(file))
def list_expenses(path: Path = CSV_FILE) -> None:
rows = read_expenses(path)
if not rows:
print("এখনও কোনো খরচ নেই।")
return
print(f"{'তারিখ':<12} {'বর্ণনা':<24} {'বিভাগ':<16} {'পরিমাণ':>12}")
print("-" * 68)
for row in rows:
print(f"{row['date']:<12} {row['description']:<24} "
f"{row['category']:<16} {Decimal(row['amount']):>12.2f}")
def show_summary(path: Path = CSV_FILE) -> None:
totals: defaultdict[str, Decimal] = defaultdict(lambda: Decimal("0.00"))
for row in read_expenses(path):
try:
amount = Decimal(row["amount"])
except (InvalidOperation, KeyError):
print("সতর্কতা: একটি ভুল amount সারি বাদ দেওয়া হয়েছে।")
continue
if amount.is_finite() and amount > Decimal("0"):
totals[row["category"]] += amount
if not totals:
print("সারাংশ দেখানোর মতো কোনো খরচ নেই।")
return
print("বিভাগভিত্তিক মোট:")
for category, total in sorted(totals.items(), key=lambda item: item[1], reverse=True):
print(f"- {category}: {total:.2f}")
grand_total = sum(totals.values(), Decimal("0.00"))
print(f"সর্বমোট: {grand_total:.2f}")
def main() -> None:
parser = argparse.ArgumentParser(description="A small CSV expense tracker")
parser.add_argument("command", choices=("add", "list", "summary"))
args = parser.parse_args()
if args.command == "add":
add_expense()
elif args.command == "list":
list_expenses()
else:
show_summary()
if __name__ == "__main__":
main()
চালানোর ধাপ
একটি নতুন ফোল্ডারে ফাইলটি রাখুন। টার্মিনালে সেই ফোল্ডারে গিয়ে python3 expense_tracker.py add চালান। Windows-এ প্রয়োজনে একই কমান্ডের জায়গায় py expense_tracker.py add লিখতে পারেন। তারিখের ঘরে 2026-10-20 লিখুন, তারপর বাস ভাড়া, যাতায়াত এবং 45.50 লিখুন। আবার add চালিয়ে দুপুরের খাবার, খাবার এবং 180 যোগ করুন।
সব রেকর্ড দেখতে কমান্ডটি হবে:
python3 expense_tracker.py list
সম্ভাব্য আউটপুট এমন হবে:
তারিখ বর্ণনা বিভাগ পরিমাণ
--------------------------------------------------------------------
2026-10-20 বাস ভাড়া যাতায়াত 45.50
2026-10-20 দুপুরের খাবার খাবার 180.00
বিভাগভিত্তিক যোগ দেখতে লিখুন:
python3 expense_tracker.py summary
আউটপুট হবে:
বিভাগভিত্তিক মোট:
- খাবার: 180.00
- যাতায়াত: 45.50
সর্বমোট: 225.50
বাস্তবে কলামের প্রস্থ ছোট হলে দীর্ঘ বাংলা বর্ণনা একটু সরে যেতে পারে; সেটি ডেটা নষ্ট হওয়া নয়, কেবল টার্মিনালের অক্ষর-প্রস্থের সীমাবদ্ধতা। CSV ফাইলটি সরাসরি টেক্সট এডিটরে খুলে দেখলে প্রতিটি রেকর্ডের গঠন বুঝতে পারবেন। বর্ণনার মধ্যে কমা থাকলেও csv মডিউল প্রয়োজনীয় উদ্ধৃতি নিজে সামলাবে।
কোডটি পড়ার কৌশল
প্রথমে ensure_csv_file দেখুন। এটি বারবার চললেও বিদ্যমান ফাইল মুছে না দিয়ে শুধু অনুপস্থিত ফাইল তৈরি করে। ask_nonempty এবং ask_positive_amount হলো ইনপুটের দরজা; এখানে ভুল আটকানো হলে পরের অংশকে তুলনামূলক পরিষ্কার রাখা যায়। ask_date তারিখকে ISO বিন্যাসে একরকম রাখে, ফলে পরে সাজানো বা অন্য প্রোগ্রামে ব্যবহার করা সহজ।
read_expenses সব সারি ডিকশনারির তালিকা হিসেবে আনে। মনে রাখবেন, CSV থেকে আসা amount স্ট্রিং। show_summary প্রতিটি স্ট্রিংকে Decimal করে এবং defaultdict-এ বিভাগের নামে মোট জমা করে। sorted-এর reverse=True বড় খরচ আগে দেখায়। শেষে sum-এর শুরুতে Decimal("0.00") দেওয়া হয়েছে, যাতে Python কোনো পূর্ণসংখ্যা দিয়ে যোগ শুরু না করে।
argparse কমান্ডের বানান সীমিত করে। তাই python3 expense_tracker.py remove লিখলে প্রোগ্রাম পরিষ্কার ত্রুটি বার্তা দেখাবে, নীরবে ভুল কাজ করবে না। এই ছোট নকশাটি CLI অ্যাপকে ভবিষ্যতে আরও কমান্ড যোগ করার উপযোগী রাখে।
যাচাই, নিরাপত্তা এবং CSV সম্পাদনা
পরিমাণের ঘরে 12.3.4, abc, -10, 0, NaN এবং Infinity একে একে দিয়ে দেখুন। প্রথম দুটিতে রূপান্তর ব্যর্থ হবে, পরেরগুলোতে সসীম-ধনাত্মক পরীক্ষায় আটকে যাবে। খুব বড় পরিমাণও Decimal গ্রহণ করতে পারে, তবে বাস্তব ব্যবহারে নিজের মুদ্রার সীমা এবং দুই দশমিকের নিয়ম নির্ধারণ করুন। এখানে quantize দুই ঘর পর্যন্ত গোল করে; গোল করার নীতি ব্যবসায়িক হিসাবের জন্য যথেষ্ট কি না আলাদা করে যাচাই করা দরকার।
CSV ফাইল হাত দিয়ে সম্পাদনা করলে শিরোনামের বানান বদলাবেন না। amount-এ মুদ্রার চিহ্ন যেমন ৳ লিখবেন না, কারণ যোগ করার আগে সেটি সংখ্যায় রূপান্তরিত হতে হবে। ফাইলের ব্যাকআপ রাখুন, বিশেষ করে একমাত্র কপি হিসেবে ব্যবহার করলে। CSV এনক্রিপ্টেড নয়; একই কম্পিউটারে অন্য ব্যবহারকারী ফাইলটি পড়তে পারেন। গোপন আর্থিক তথ্যের জন্য অনুমতি নিয়ন্ত্রণ, এনক্রিপশন এবং নির্ভরযোগ্য ব্যাকআপ প্রয়োজন।
সাধারণ সমস্যা ও সমাধান
python3: command not found দেখালে Python 3 ইনস্টল আছে কি না পরীক্ষা করুন। Windows-এ py --version চেষ্টা করুন। No such file or directory সাধারণত ভুল ফোল্ডার থেকে কমান্ড চালানোর ইঙ্গিত; ls বা dir দিয়ে স্ক্রিপ্টের অবস্থান মিলিয়ে নিন। Permission denied হলে এমন ফোল্ডার বেছে নিন যেখানে আপনার লেখার অনুমতি আছে।
যদি প্রতিবার খালি CSV তৈরি হয়, আপনি সম্ভবত অন্য working directory-তে আছেন। python3 -c "import pathlib; print(pathlib.Path.cwd())" দিয়ে বর্তমান অবস্থান দেখুন। বাংলা অক্ষর বিকৃত হলে টার্মিনালের UTF-8 সেটিং এবং ফাইলের utf-8-sig এনকোডিং পরীক্ষা করুন। CSV-তে পুরনো কোনো সারির amount ভুল হলে summary সতর্ক করে সারিটি বাদ দেবে; মূল ফাইল ঠিক করে আবার চালান।
অনুশীলন ও পরবর্তী উন্নতি
প্রথম অনুশীলনে delete কমান্ড যোগ করুন, তবে মুছে ফেলার আগে রেকর্ডের নম্বর দেখিয়ে নিশ্চিতকরণ নিন। দ্বিতীয় অনুশীলনে নির্দিষ্ট মাসের সারাংশ বের করুন। তৃতীয় অনুশীলনে export কমান্ড লিখে বিভাগভিত্তিক রিপোর্ট আলাদা CSV-তে সংরক্ষণ করুন। চতুর্থ অনুশীলনে একটি ঐচ্ছিক note কলাম যোগ করে দেখুন DictWriter-এর fieldnames এবং প্রতিটি রেকর্ড কোথায় বদলাতে হয়।
আরও বড় হলে CSV-র বদলে SQLite ব্যবহার, ইউনিট টেস্ট, কনফিগারেশন ফাইল, মুদ্রার নাম এবং মাসিক বাজেট যোগ করা যায়। পরীক্ষার সময় temporary directory ব্যবহার করলে আসল হিসাব নষ্ট হবে না। ইনপুট ফাংশনগুলো আলাদা রাখার ফলে পরে GUI বা ওয়েব ফর্ম থেকেও একই হিসাবের ফাংশন পুনর্ব্যবহার করা সম্ভব।
সীমাবদ্ধতা ও দায়িত্বশীল ব্যবহার
এই প্রকল্প শেখার জন্য তৈরি; এটি পূর্ণাঙ্গ হিসাবরক্ষণ, কর গণনা, ব্যাংক সমন্বয় বা বিনিয়োগ ব্যবস্থাপনা সফটওয়্যার নয়। একাধিক ব্যক্তি একই CSV একসঙ্গে লিখলে রেকর্ড হারাতে পারে। ফাইল দুর্নীতির বিরুদ্ধে লেনদেন ব্যবস্থা নেই, ব্যবহারকারী পরিচয় যাচাই নেই, এবং তারিখের ভিত্তিতে রিপোর্ট সীমিত। তাই গুরুত্বপূর্ণ আর্থিক সিদ্ধান্ত নেওয়ার একমাত্র উৎস হিসেবে এটিকে ব্যবহার করবেন না। এটি কোনো আর্থিক পরামর্শও নয়; নিজের পরিস্থিতি অনুযায়ী যোগ্য পেশাদারের পরামর্শ নিন।
এই ছোট CLI-র মূল শিক্ষা হলো একটি সমস্যাকে পরিষ্কার ডেটা মডেল, নির্ভরযোগ্য ইনপুট যাচাই এবং সহজ ফাইল ফরম্যাটে ভাঙা। প্রতিটি পরিবর্তনের পর কয়েকটি বৈধ ও অবৈধ ইনপুট দিয়ে পরীক্ষা করুন, CSV-র ব্যাকআপ রাখুন এবং ধীরে ধীরে নতুন সুবিধা যোগ করুন। এভাবেই একটি ছোট স্ক্রিপ্ট Python শেখার বাস্তব, পরিমাপযোগ্য প্রকল্পে পরিণত হয়।
একটি রেকর্ডের জীবনচক্র
একটি খরচ যোগ করার মুহূর্ত থেকে রিপোর্ট দেখানো পর্যন্ত কয়েকটি ধাপ ঘটে। প্রথমে argparse কমান্ড শনাক্ত করে। এরপর তারিখ ফাংশন ইনপুটকে date অবজেক্টে যাচাই করে ISO স্ট্রিং বানায়। বর্ণনা ও বিভাগে strip() চালানো হয়, তাই শুরু বা শেষে অনিচ্ছাকৃত ফাঁকা জায়গা জমে থাকে না। পরিমাণের ক্ষেত্রে আলাদা পথ অনুসরণ করা হয়: টেক্সট থেকে দশমিক মান, তারপর সসীমতা, তারপর ধনাত্মকতা এবং শেষে দুই ঘরে quantize।
এই ক্রমটি গুরুত্বপূর্ণ। আগে Decimal বানিয়ে না নিলে NaN বা অসীম মানকে সাধারণ সংখ্যার মতো ধরে ফেলতে পারতাম। আবার কেবল সংখ্যায় রূপান্তর করলেই খালি স্ট্রিংয়ের সমস্যা মিটত না। প্রত্যেক যাচাই একটি নির্দিষ্ট দায়িত্ব পালন করছে। সফল হলে রেকর্ড ডিকশনারিতে গিয়ে DictWriter.writerow-এর মাধ্যমে একটি CSV সারি হয়। একই কলামের নাম সব জায়গায় ব্যবহার করায় বানান ভুলের ঝুঁকি কমে।
পরে list কমান্ড সেই ফাইলকে পড়ে। DictReader প্রথম সারির শিরোনাম থেকে কী তৈরি করে এবং প্রতিটি মান স্ট্রিং হিসেবে দেয়। তাই প্রদর্শনের সময় amount আবার Decimal হয়েছে। summary একই রকম পড়ে, কিন্তু এবার category-কে মানচিত্রের key ধরে যোগ করে। ডেটা লেখার সময় এবং পড়ার সময় আলাদা ধরনের কাজ হচ্ছে—লেখার সময় বৈধতা, পড়ার সময় রূপান্তর ও প্রতিরোধমূলক পরীক্ষা। এই বিভাজন নতুন ফিচার যোগ করা সহজ করে।
নিজের কমান্ড-লাইন পরীক্ষার তালিকা
একটি ছোট টেস্ট তালিকা লিখে রাখলে পরিবর্তনের পর আত্মবিশ্বাস বাড়ে। প্রথমে কোনো expenses.csv না থাকা অবস্থায় list চালান। প্রত্যাশা হবে খালি ফাইল তৈরি এবং “এখনও কোনো খরচ নেই” বার্তা। তারপর একটি সাধারণ সঠিক রেকর্ড যোগ করুন এবং list ও summary দুটোই পরীক্ষা করুন। বর্ণনায় কমা, বাংলা অক্ষর এবং দীর্ঘ বাক্য দিয়ে আরেকটি রেকর্ড যোগ করুন; CSV উদ্ধৃতি ঠিক রাখছে কি না দেখুন।
এরপর ভুল তারিখ, খালি বিভাগ এবং একে একে abc, 0, -2, NaN, Infinity দিন। প্রতিটি ক্ষেত্রে প্রোগ্রামকে নতুন ইনপুট চাইতে হবে এবং অর্ধেক লেখা সারি ফাইলে ঢোকানো যাবে না। Ctrl-C চাপলে ব্যবহারকারী মাঝপথে বেরিয়ে যেতে পারেন—এটি স্বাভাবিক কমান্ড-লাইন আচরণ, যদিও সুন্দর বার্তার জন্য ভবিষ্যতে KeyboardInterrupt ধরা যায়। ভুল হাতে সম্পাদিত CSV-র amount দিয়ে summary চালিয়ে সতর্কবার্তাও পরীক্ষা করুন।
স্বয়ংক্রিয় পরীক্ষার ধারণা শেখার জন্য tempfile.TemporaryDirectory কাজে লাগে। সেখানে আলাদা CSV বানিয়ে read_expenses এবং show_summary পরীক্ষা করা যায়, ফলে প্রকৃত হিসাবের ফাইল বদলে যাবে না। ইনপুট-নির্ভর ফাংশন পরীক্ষা করতে unittest.mock.patch দিয়ে input-এর উত্তর নির্ধারণ করা যায়। এখনই পরীক্ষার ফ্রেমওয়ার্ক দরকার নেই, কিন্তু প্রতিটি প্রত্যাশা লিখে রাখা বড় প্রকল্পের অভ্যাস গড়ে দেয়।
CSV নকশার কয়েকটি বাস্তব সিদ্ধান্ত
CSV মানুষের চোখে পড়ে এবং spreadsheet-এ খোলা যায়, তাই শেখার প্রকল্পে সুবিধাজনক। তবে এটি schema-র নিয়ম নিজে জোর করে না। কেউ কলামের ক্রম বদলালে বা পুরনো সারি অসম্পূর্ণ করলে পড়ার সময় সমস্যা হতে পারে। এই উদাহরণে DictReader-এর সুবিধা নেওয়া হয়েছে, কিন্তু row["category"] অনুপস্থিত হলে যে কোনো ত্রুটি হতে পারে। production পর্যায়ে প্রতিটি সারির field পরীক্ষা, ভুল সারির আলাদা লগ এবং সংস্করণযুক্ত schema যোগ করা দরকার।
utf-8-sig বেছে নেওয়ার কারণও ব্যবহারিক। UTF-8 মূল ডেটা এনকোডিং হিসেবে বহনযোগ্য, আর BOM-সহ রূপ কিছু Windows প্রোগ্রামকে বাংলা কলাম চিনতে সাহায্য করে। একই ফাইল অন্য টুলে নিলে তার encoding অনুমান না করে স্পষ্টভাবে UTF-8 নির্বাচন করুন। newline='' বাদ দিলে Python-এর text newline translation এবং CSV parser-এর নিজস্ব newline ব্যবস্থার মধ্যে দ্বন্দ্ব তৈরি হতে পারে; বিশেষ করে Windows-এ ফাঁকা সারি দেখা দিতে পারে।
টাকার মুদ্রা এই কোডে আলাদা কলাম নয়। তাই একই ফাইলে টাকা, ডলার বা অন্য মুদ্রার রেকর্ড মেশানো ঠিক হবে না। উন্নত সংস্করণে currency field যোগ করে প্রতিটি রেকর্ডের মুদ্রা আলাদা রাখা, অথবা শুরুতেই একটি মুদ্রা নির্দিষ্ট করা উচিত। বিনিময় হার, কর, ফেরত এবং ঋণাত্মক refund যোগ করলে নিয়ম স্পষ্ট লিখে তারপর কোড বদলাবেন; শুধু minus চিহ্ন অনুমতি দিলেই হিসাবের অর্থ পরিষ্কার হয় না।
শেখার পথ এবং সীমা
এই প্রোগ্রাম দিয়ে Python-এর কয়েকটি গুরুত্বপূর্ণ ধারণা একসঙ্গে দেখা যায়: ফাংশন, type hint, exception, loop, dictionary, list, file context manager এবং command-line argument। প্রতিটি অংশ আলাদা করে পুনর্লিখুন। যেমন প্রথমে শুধু CSV header তৈরি করুন, পরে একটি স্থির রেকর্ড লিখুন, তারপর ব্যবহারকারীর input আনুন। ধাপে ধাপে করলে ত্রুটির উৎস বোঝা সহজ হয় এবং কপি-পেস্টের ওপর নির্ভরতা কমে।
কোডটি ছোট রাখার অর্থ ইচ্ছাকৃত। এতে login নেই, একই সময়ে বহু প্রক্রিয়ার file locking নেই, undo নেই, encryption নেই, search বা date filter নেই। দীর্ঘমেয়াদি হিসাবের ক্ষেত্রে backup strategy অপরিহার্য: নিয়মিত কপি রাখুন, backup-এর ভেতরেও সংবেদনশীল তথ্যের নিরাপত্তা বিবেচনা করুন, এবং restore করে দেখা কপি সত্যিই পড়া যায় কি না যাচাই করুন। কোনো গুরুত্বপূর্ণ সিদ্ধান্তের আগে উৎস নথির সঙ্গে হিসাব মিলিয়ে নিন।
শেষ পর্যন্ত expense tracker-কে একটি শিক্ষা-প্রকল্প হিসেবে দেখুন। আপনি এখানে অর্থনৈতিক পরামর্শ পাচ্ছেন না এবং এই ফলাফল কর, ঋণ, বাজেট বা বিনিয়োগের জন্য যথেষ্ট প্রমাণ নয়। ব্যক্তিগত পরিস্থিতি জটিল হলে যোগ্য হিসাবরক্ষক বা আর্থিক পেশাদারের সহায়তা নিন। নিজের ডেটার মালিকানা, গোপনীয়তা ও ব্যাকআপের দায়িত্বও নিজের। ছোট স্ক্রিপ্টে এই সতর্কতা যোগ করাই পরিণত সফটওয়্যার চিন্তার প্রথম ধাপ।
রেফারেন্স: Python-এর csv মডিউলের অফিসিয়াল ডকুমেন্টেশন দেখুন।
No comments:
Post a Comment