在日常生活中,我们经常需要处理各种银行账单,包括信用卡账单、储蓄账户账单等。而Beancount是一种强大的财务记账工具,可以帮助我们有效地管理和跟踪财务交易。本教程将向您展示如何将不同银行的账单转换为Beancount格式,以便更好地管理个人财务。
背景故事
假设您有多个银行账户,每月都会收到不同银行的账单。这些账单可能以不同的格式和结构呈现,使您难以一目了然地了解自己的财务状况。同时,您可能还希望将这些财务数据记录到Beancount中,以便轻松生成财务报表和分析您的支出。
因此,本教程将介绍如何使用Python编程语言来处理不同银行的账单,并将其转换为Beancount格式,使您能够更轻松地管理个人财务。
准备工作
在开始之前,您需要准备以下工作:
-
确保您已经安装了Python编程语言。
-
确保您已经安装了以下Python库:
- pandas:用于处理和分析数据。
- numpy:用于数值计算。
- os:用于文件和目录操作。
- re:用于正则表达式操作。
-
从您的银行获取账单文件,可以是Excel格式或CSV格式。
教程步骤
本教程将分为以下几个步骤来实现将银行账单转换为Beancount格式:
步骤一:导入所需库和设置文件路径
首先,我们需要导入所需的Python库,并设置输入文件的路径、银行名称以及输出文件的路径。以下是示例代码:
import os
import re
import pandas as pd
import numpy as np
# 获取当前文件夹路径
dir = os.path.dirname(os.path.abspath(__file__))
# 输入文件路径,可以手动输入或从命令行获取
input_file = input("输入账单路径:")
# 输入账单归属银行(目前支持CCB、CMB、SRCB、ABC)
bank = input("输入账单归属银行[CCB、CMB、SRCB、ABC]:")
# 输出文件路径
output_file = dir + "\\" + bank + ".bean"
# 配置文件路径
config_file = dir + "\\config\\" + bank + ".conf"
在这个步骤中,我们首先获取当前文件夹的路径,然后要求用户输入账单文件的路径和账单归属银行。最后,我们定义了输出文件的路径和配置文件的路径。
步骤二:整理银行账单数据
接下来,我们需要根据不同银行的账单格式,编写相应的数据整理函数。我们这里以建设银行(CCB)和招商银行(CMB)为例。
CCB账单整理
# CCB账单excel的整理
def CCB_data(_file_):
data = pd.read_excel(_file_)
data.columns = ["No", "text0", "CCY", "Yuan", "time", "cost", "bal", "text1", "text2"]
data = data.iloc[2:]
data["time"] = pd.to_datetime(data["time"]).astype(str)
data.loc[:, "account"] = data["text0"] + ":" + data["text2"]
data["CCY"] = data["CCY"].replace("人民币元", "CNY")
data = data[["time", "cost", "CCY", "account", "text0", "text1", "text2"]]
return data
CMB账单整理
# CMB账单csv的整理
def CMB_data(_file_):
data = pd.read_csv(_file_)
data.columns = ["time", "CCY", "cost", "bal", "text0", "text2"]
data["time"] = pd.to_datetime(data["time"]).astype(str)
data["cost"] = data["cost"].astype(str)
data.loc[:, "text1"] = None
data.loc[:, "account"] = data["text0"] + ":" + data["text2"]
data = data[["time", "cost", "CCY", "account", "text0", "text1", "text2"]]
return data
在这两个函数中,我们分别处理了建设银行和招商银行的账单数据,整理成统一的数据格式,包括时间、金额、货币代码、账户信息等。
步骤三:关键字查找和替换
接下来,我们需要根据配置文件中的关键字,对账单中的账户信息进行查找和替换。这可以帮助我们将不同的账户信息映射到统一的账户名称。
# 关键字查找替换
def replace(_data_, _config_):
conf = pd.read_csv(_config_)
for conf in conf.itertuples():
_data_ = _data_.str.replace(".*" + conf[1] + ".*", conf[2], regex=True)
return _data_
在这个函数中,我们读取了配置文件中的关键字和对应的替换值,然后使用正则表达式在账单数据中进行查找和替换操作。
步骤四:生成Beancount格式的字段
最后,我们将整理后的账单数据转换为Beancount格式的字段,以便后续导入到Beancount中。以下是生成Beancount字段的函数:
# 输出beancount格式的字段
def to_bean(_data_):
global bank
bean = _data_["time"] + ' * \"' + _data_["text
0"] + '\"\n\t'
if _data_["text1"].notnull().any():
bean = bean + 'notes: \"' + _data_["text1"] + '\"\n\t'
bean = bean + 'id: \"' + _data_["text2"] + '\"\n\t'
bean = bean + "Assets:Bank:" + bank + " " + _data_["cost"] + " " + _data_["CCY"] + "\n\t"
bean = bean + _data_["account"] + "\n"
return bean
在这个函数中,我们根据Beancount的格式规范,构建了包括时间、交易描述、备注、账户信息、金额和货币代码的字段。
步骤五:导出Beancount文件
最后一步是将生成的Beancount字段写入到输出文件中,以完成账单转换操作。
# 整理为beancount格式
if bank == "CCB":
DATA = CCB_data(input_file)
if bank == "CMB":
DATA = CMB_data(input_file)
# 按conf文件查找替换关键字
DATA["account"] = replace(DATA["account"], config_file)
# 整理为beancount格式的字段
bean = to_bean(DATA).to_frame()
# 输出Beancount文件
for bean in bean.itertuples():
text = text + str(bean[1]) + "\n"
file = open(output_file, 'w')
file.write(text)
file.close()
在这个步骤中,我们根据用户输入的银行名称选择相应的账单整理函数,然后进行关键字查找和替换操作,最后生成Beancount字段并导出到文件中。
结语
通过本教程,您学会了如何将不同银行的账单转换为Beancount格式,从而更好地管理个人财务。这将帮助您轻松跟踪支出、生成财务报表,并更好地了解自己的财务状况。