# 小型项目示例：记账程序

URL: https://caijiao.org/python/ch11/project-budget
Source: docs/python/ch11/project-budget.md
Description: 本章将通过一个简单的记账程序示例，展示如何运用 Python 编写一个基础的应用，涵盖文件操作、数据存储和基本的用户交互。

在本章中，我们将编写一个简单的记账程序，用户可以记录收入和支出，程序将存储这些数据并允许用户查看历史记录。我们将使用 [Python](/python/) 的文件操作、数据处理以及简单的用户输入输出，来实现一个基本的记账功能。

## 项目目标

1. 用户可以录入收入和支出。
2. 程序会将记录保存到文件中。
3. 用户可以查看收入和支出的总额。
4. 提供简单的菜单供用户操作。

## 项目结构

```

account\_book/
│
├── account.py        # 主程序，处理记账逻辑
├── data.txt          # 存储记录的文件
└── README.md         # 项目说明

```

## 代码实现

### 1. 创建 `account.py` 文件

```python
# account.py

import os

# 数据文件路径
DATA_FILE = 'data.txt'

# 保存记录到文件
def save_record(record):
    with open(DATA_FILE, 'a') as file:
        file.write(record + '\n')

# 显示所有记录
def show_records():
    if not os.path.exists(DATA_FILE):
        print("没有记账记录。")
        return
    with open(DATA_FILE, 'r') as file:
        records = file.readlines()
        if not records:
            print("没有记账记录。")
        else:
            for record in records:
                print(record.strip())

# 计算总收入和支出
def calculate_balance():
    income = 0
    expense = 0
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, 'r') as file:
            records = file.readlines()
            for record in records:
                amount = float(record.split()[1])
                if record.startswith("收入"):
                    income += amount
                elif record.startswith("支出"):
                    expense += amount
    return income, expense

# 显示菜单
def display_menu():
    print("\n--- 记账程序 ---")
    print("1. 记录收入")
    print("2. 记录支出")
    print("3. 查看记录")
    print("4. 查看总余额")
    print("5. 退出")
    choice = input("请选择操作: ")
    return choice

# 主程序
def main():
    while True:
        choice = display_menu()
        if choice == '1':
            amount = input("请输入收入金额: ")
            description = input("请输入收入描述: ")
            record = f"收入 {description} {amount}"
            save_record(record)
        elif choice == '2':
            amount = input("请输入支出金额: ")
            description = input("请输入支出描述: ")
            record = f"支出 {description} {amount}"
            save_record(record)
        elif choice == '3':
            show_records()
        elif choice == '4':
            income, expense = calculate_balance()
            print(f"总收入: {income} 元, 总支出: {expense} 元, 余额: {income - expense} 元")
        elif choice == '5':
            print("感谢使用记账程序！")
            break
        else:
            print("无效选择，请重新输入。")

if __name__ == '__main__':
    main()
```

### 2. 数据存储文件 `data.txt`

这个文件将用于存储用户的记账记录，每一行包含一条收入或支出的记录，例如：

```
收入 工资 5000
支出 饭钱 50
收入 奖金 1000
支出 购物 200
```

### 3. 如何运行

- 将上述代码保存为 `account.py` 文件。
- 在命令行中运行以下命令：

```bash
python account.py
```

### 4. 功能说明

#### 记录收入

当用户选择记录收入时，程序会要求输入收入的金额和描述，然后将这条记录保存到文件中。

#### 记录支出

当用户选择记录支出时，程序会要求输入支出的金额和描述，并将记录保存到文件中。

#### 查看所有记录

用户可以选择查看所有的记账记录，程序会从文件中读取记录并显示。

#### 查看总余额

用户可以查看当前的总收入、总支出以及余额，程序会根据历史记录计算出这些信息。

#### 退出程序

用户可以选择退出程序，程序将结束。

## 项目扩展

本项目是一个简单的记账程序，适合初学者练习。随着项目需求的增加，我们可以考虑以下功能扩展：

- 使用数据库代替文本文件存储记录。
- 增加分类功能，按类别查看收入和支出。
- 提供图形界面（GUI）以提高用户体验。
- 生成月度或年度报表，分析财务状况。

通过这个简单的记账程序，你可以学会如何使用 Python 处理文件操作、用户输入、数据存储和基本的业务逻辑。
