设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 10018|回复: 7
打印 上一主题 下一主题

关于【每日一坑】记账本

[复制链接]

3

主题

0

好友

66

积分

注册会员

Rank: 2

跳转到指定楼层
楼主
发表于 2016-8-16 16:22:44 |只看该作者 |正序浏览
我想知道那个记账本的小程序怎么写的,不知道有没有可以告诉我?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2020-10-30 21:44:51 |只看该作者
jodie 发表于 2020-10-29 23:24
crossin先生,请问这个记账本哪里需要改进吗?

挺好的。
对输入内容可以做一下校验,用户有可能手误或者故意输入一些乱七八糟的数据

然后eval这个东西,虽然用起来爽,但很危险,它会把文字当做代码来执行。如果有人看到你这个代码,可以通过在数据文件里加一些恶意代码来做各种操作。如果你想存储数据,可以用json
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

52

积分

注册会员

Rank: 2

7#
发表于 2020-10-29 23:24:25 |只看该作者
crossin先生 发表于 2016-8-19 11:06
可以的

crossin先生,请问这个记账本哪里需要改进吗?
  1. import os
  2. import datetime
  3. import re

  4. class Account():
  5.     def __init__(self):
  6.         # 数据存储的文件路径
  7.         self.file_name = "balance.txt"
  8.         self.file_path = os.path.join(os.getcwd(), self.file_name)

  9.         # 判断是否是首次记账,若否,则读出文件中的余额balance;若是,余额为0
  10.         try:
  11.             with open(self.file_path,"r", encoding="utf-8") as obj:
  12.                 balance_string = obj.readline().strip("\n")
  13.             self.balance = eval(balance_string)["balance"]
  14.             self.is_first = 0
  15.         except FileNotFoundError as e:
  16.             self.balance = 0
  17.             self.is_first = 1

  18.     def keep_accounts(self,item,money):
  19.         '''记账'''
  20.         with open(self.file_path, "a", encoding = "utf-8") as obj:
  21.             time = str(datetime.date.today())
  22.             line = time + " " + money + " " + item + "\n"
  23.             obj.write(line)

  24.         self.balance += float(money)


  25.     def check_the_balance(self):
  26.         '''查询余额'''
  27.         print(self.balance)


  28.     def check_the_details(self):
  29.         '''查询账单详情'''
  30.         try:
  31.             with open(self.file_path, "r", encoding = "utf-8") as obj:
  32.                 details_list = obj.readlines()
  33.                 for one in details_list:
  34.                     if one.startswith("{"):
  35.                         continue
  36.                     print(one)
  37.         except FileNotFoundError as e:
  38.             print("尚未有收支记录!")


  39. if __name__ == "__main__":
  40.     account = Account()
  41.     while True:
  42.         choice = input("选择操作:\n\t1、记账\n\t2、查余额\n\t3、收支明细\n").strip()
  43.         if choice == "1":
  44.             money = input("金额: ").strip()
  45.             item = input("名目: ").strip()
  46.             account.keep_accounts(item,money)
  47.         elif choice == "2":
  48.             account.check_the_balance()
  49.         elif choice == "3":
  50.             account.check_the_details()
  51.         elif choice == "leave":
  52.             break


  53.     with open(account.file_path,"r+", encoding ="utf-8") as obj:
  54.         data = obj.read()

  55.         # 若非首次记账,将新的余额替换旧的余额
  56.         if account.is_first == 0:
  57.             new_balance_string = '{{"balance":{}}}'.format(str(account.balance))
  58.             data = re.sub(r'{"balance":.*?}',new_balance_string,data)
  59.         # 若是首次记账,在文件头部记录每次记账结束后的余额
  60.         else:
  61.             new_balance_string = '{{"balance":{}}}\n'.format(str(account.balance))
  62.             data = new_balance_string + data

  63.         obj.seek(0)
  64.         obj.write(data)
复制代码
回复

使用道具 举报

0

主题

0

好友

6

积分

新手上路

Rank: 1

6#
发表于 2020-6-15 15:41:56 |只看该作者
本帖最后由 feifei 于 2020-6-16 10:27 编辑

新手打卡,crossin先生,请指点
import csv
import datetime

def keepAccounts():
    f=open('1.csv','a',encoding='utf-8',newline=''"")
    keeptime=datetime.date.today()
    mingmu=input("名目:")
    money=int(input("金额:"))
    csv_writer=csv.writer(f)
    csv_writer.writerow([keeptime,mingmu,money])
    f.close()
def checkAccount():
    f = open('1.csv', 'r',encoding='utf-8')
    csv_reader=csv.reader(f)
    sum1=0
    for i in csv_reader:
        #print (i[2])
        #print (type(i[2]))
        sum1=sum1+int(i[2])
    print (sum1)
def printAccount():
    f = open('1.csv', 'r', encoding='utf-8')
    csv_reader = csv.reader(f)
    for i in csv_reader:
        print (','.join(i))
while True:
    a = input("选择操作:\n1.记账\n2.查余额\n3.收支明细\n")
    if a=='1':
        keepAccounts()
    elif a=='2':
        checkAccount()
    elif a=='3':
        printAccount()
    else:
        print ('退出记账本')
        break





回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2016-8-19 11:06:05 |只看该作者
灰机 发表于 2016-8-18 20:25
还行吧?

可以的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

0

好友

66

积分

注册会员

Rank: 2

地板
发表于 2016-8-18 20:25:22 |只看该作者
crossin先生 发表于 2016-8-17 11:18
可以参考 写文件 和 用文件保存游戏 这几课的内容,在此基础上改进下程序流程。
先从最简单的,一个记录功 ...

还行吧?
回复

使用道具 举报

3

主题

0

好友

66

积分

注册会员

Rank: 2

板凳
发表于 2016-8-18 20:23:15 |只看该作者
谢谢crossin先生,我已经写了出来了原创的,新鲜出炉了
  1. #coding:gbk

  2. one=1
  3. two=2
  4. three=3
  5. running=1
  6. while running:
  7.     print "      ============"
  8.     print "      |||记账本|||"
  9.     print '======================='
  10.     print "请回复数字可执行:"
  11.     print "1.查询账单"
  12.     print "2.写账单"
  13.     print "3.退出"
  14.     number=int(raw_input())
  15.     print '======================='
  16.     if number==two:
  17.         date=str(raw_input("请输入日期,年月日: "))  
  18.         m=str(raw_input("支出/存入"))
  19.         b=str(raw_input("备注:"))
  20.         o=open("jizhangben.txt","a")
  21.         o.write("\n"+date+"   "+m+"   "+b)
  22.         o.close()

  23.     elif number==one:
  24.         op=open("jizhangben.txt")
  25.         for i in op:
  26.             print i
  27.         op.close()
  28.     elif number==3:
  29.         running=0
  30.         print "已退出"
  31.     else:
  32.         print "没有这个功能"


  33.     if number==False:
  34.         print "You can not do this."
  35.     print '======================='
  36.     print
  37.     print
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2016-8-17 11:18:38 |只看该作者
可以参考 写文件 和 用文件保存游戏 这几课的内容,在此基础上改进下程序流程。
先从最简单的,一个记录功能开始写,然后不断完善功能
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 00:28 , Processed in 0.024060 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部