内容正文:
任务6.1 文件操作
记账本
6.1 文件操作——记账本
【任务描述】
小T想编写一个电子记账本,功能类似银行账单,用户可以录入收入、支出及对应备注,并查询账单,了解详情。程序根据用户录入数据,生成包含日期、收入、支出、余额、备注等信息的记录并写入文件进行保存,能够读取文件内容以便用户查询。
6.1 文件操作——记账本
【任务分析】
根据任务需求,完成该任务需要对文件进行读写操作,实现对数据的记录。
(1)写入数据,将收支数据以适当的数据格式写入文件。
(2)读取数据,读取文件内容获取收支数据并参与计算。
(3)模块化设计,根据不同的功能,细分多个模块并实现相应功能。
6.1 文件操作——记账本
6.1.1 文件的打开
6.1.2 文件的关闭
6.1.3 文件的读写操作
6.1.4 文件的定位读写
6.1.5 任务实现——电子记账本
6.1.4 文件的定位读写
python在文件读写过程中使用文件指针记录文件读写的当前位置;
打开文件时,文件指针指向初始位置,随着文件的读写操作,指针不断移动。
6.1.4 文件的定位读写
操作方法 说明
f.tell() tell()方法获取文件文件指针的当前位置
f.seek(offset, whence) seek()方法可以改变文件指针的位置;
offset:偏移量。偏移量为正向文件尾移动;偏移量为负,向文件开头移动。
whence:参考点。0表示文件开头(默认值);1表示当前位置;2表示文件末尾。
注意:文本文件没有使用二进制模式选项打开的文件,只允许从文件头开始计算相对位置,从文件尾或中间计算时就会引发异常。
在对文件进行读写操作时,程序会从上次读写的位置继续操作,其实python在文件读写过程中使用了文件指针这个概念,文件指针所指位置即为文件当前位置,打开文件时,文件指针指向初始位置,随着文件的读写操作,指针不断移动。
6.1.4 文件的定位读写
其中,f为文件对象。tell()方法返回一个数字,表示文件指针的当前位置,即相对于文件开头的字节数。
f.tell()
1.tell()方法
在对文件进行读写操作时,可以通过tell()方法来获取文件指针的当前位置,其语法格式如下:
6.1.4 文件的定位读写
【例6-9】使用tell()方法使用
with open('data6-3.txt','r') as f: # 以只读模式打开文件,文件指针指向文件开头 print(f.tell()) # 查看文件指针当前位置 print(f.read(5)) # 读取5个字节 print(f.tell())with open('data6-3.txt','a') as f: # 以追加模式打开文件,文件指针指向文件结尾 print(f.tell())
0
Hello
5
66
从这个示例中,我们可以看到指针的移动效果。通过文件指针的移动,我们就可以对文件的任意位置进行读写操作。
6.1.4 文件的定位读写
f:文件对象。
offset:偏移量。表示指定位置相对于参考点移动的字节数。偏移量为正表示向文件末尾移动,偏移量为负表示向文件开头移动。
whence:参考点。表示文件指针移动的参考位置。0表示文件开头(默认值);1表示当前位置;2表示文件末尾。
f.seek(offset, whence)
2.seek()方法
使用seek()方法可以改变文件指针的位置,从而实现读写文件的指定位置,其语法格式如下:
6.1.4 文件的定位读写
【例6-10】使用seek()方法。
with open('data6-3.txt','rb') as f:
f.seek(5,0) # 从文件开头向文件末尾移动5个字节
print(f.tell())
f.seek(5,1) # 从当前位置向文件末尾移动5个字节
print(f.tell())
f.seek(-5,2) # 从文件末尾向文件开头移动5个字节
print(f.tell())
5
10
61
从这个示例中,我们可以看到指针的移动效果。通过文件指针的移动,我们就可以对文件的任意位置进行读写操作。
即学即答:
以下选项中,不是Python文件处理.seek()方法的参数是?
A.0 B.1 C.-1 D.2
6.1.4 文件的定位读写
6.1.5 任务实现——记账本
6.1.5 任务实现——记账本
【任务描述】
编写电子记账本程序,使用户能够录入收入、支出及对应备注。程序根据用户录入的数据,生成包含日期、收入、支出、余额、备注等信息的记录并写入文件进行保存,能够读取文件内容以便用户查询。
6.1.5 任务实现——记账本
【任务分析】
程序通过对文件进行读写操作实现数据记录的需求。根据任务需求可以将程序分为三个功能模块:收入记录、支出记录、查询详情。程序采用模块化编程,通过不同函数实现相应功能。
(1)收入记录模块:接收用户收入数据,读取上次余额,计算新的余额,生成包含日期、收入、支出、余额、备注信息的新记录并将其写入文件。
(2)支出记录模块:接收用户支出数据,读取上次余额,计算新的余额,生成包含日期、收入、支出、余额、备注信息的新记录并将其写入文件。
(3)账单查询模块:读取账本文件信息,格式化后输出。
(4)功能菜单模块:打印功能菜单,根据用户选择调用不同的模块。
6.1.5 任务实现——记账本
结合程序需求,设计程序函数及功能如下:
(1)menu_ show():菜单函数,显示功能菜单。
(2)save():收入记录函数,记录收入信息。
(3)cost():支出记录函数,记录支出信息。
(4)bill_show():显示账单函数,显示全部账单信息。
(5)main():主函数,程序入口,初始化账单文件,功能菜单选择。
程序使用的账单文件为:bill_record.db。
【例6-11】任务实现:电子记账本。
6.1.5 任务实现——记账本
def menu_show():
print("="*50)
print("电子记账本V1.0")
print("1.支出登记")
print("2.收入登记")
print("3.查看账单")
print("0.退出系统")
print("="*50)
(1)menu_show()菜单函数。
6.1.5 任务实现——记账本
def save():
with open(fname, 'r') as f:
content = f.read()
account = eval(content)
old_balance = account[-1]['balance']
new_bill = {}
new_bill['date'] = time.strftime("%Y-%m-%d")
new_bill['outgoings'] = 0
new_bill['incomings'] = int(input("请输入收入金额(元):"))
new_bill['comment'] = input("收入说明:")
new_bill['balance'] = old_balance + new_bill['incomings']
account.append(new_bill)
with open(fname, 'w') as f:
f.write(str(account))
(2)save()收入记录函数。
17
6.1.5 任务实现——记账本
def cost():
with open(fname, 'r') as f:
content = f.read()
account = eval(content)
old_balance = account[-1]['balance']
new_bill={}
new_bill['date'] = time.strftime("%Y-%m-%d")
new_bill['outgoings'] = int(input("请输入支出金额(元):"))
new_bill['comment'] = input("支出说明:")
new_bill['incomings'] = 0
new_bill['balance'] = old_balance-new_bill['outgoings']
account.append(new_bill)
with open(fname,'w') as f:
f.write(str(account))
(3)cost()支出记录函数。
18
6.1.5 任务实现——记账本
def bills_show():
with open(fname, 'r') as f:
content = f.read()
account = eval(content)
print("="*50)
print("账单信息如下(单位:元):")
print("%-14s%-7s%-7s%-7s%s"%('日期','收入','支出','余额','备注'))
for t in account:
print("%-15s%-8d%-8d%-8d%-s"%(t['date'],t['incomings'],\
t['outgoings'],t['balance'],t['comment']))
print("="*50)
(4)bill_show()显示账单函数。
19
6.1.5 任务实现——记账本
def main():
bill = [{'date':'--------', 'incomings':0, 'outgoings':0, 'balance':0, 'comment':'initial'}] #账单数据采用字典列表存储
if not os.path.isfile(fname): #判断账单文件是否存在
with open(fname, 'w') as f:
f.write(str(bill))
while True:
menu_show()
key = input("请输入数字选择功能(0/1/2/3):") #功能选择
if key == '1':
cost()
elif key == '2':
save()
elif key == '3':
bills_show()
elif key == '0':
quit_confirm = input("是否退出?(Y/N)")
if quit_confirm.upper() == 'Y':
print("开源节流,早日实现小目标!")
break
else:
print("输入错误,请重试!")
(5)main()主函数。
20
6.1.5 任务实现——记账本
import time
import os
fname = "e:/bill_record.db" #指定保存数据的文件
if __name__ == "__main__":
main()
(6)调用主函数。
21
6.1.5 任务实现——记账本
边学边练:
用Python编写程序,完成以下功能:
(1)读取一个存储若干数字(数字间用空格隔开)的文件nums.txt。
(2)对数字进行排序后输出。
$$