鱼C论坛

 找回密码
 立即注册
查看: 793|回复: 13

[已解决]求助,怎么改写io的内容

[复制链接]
发表于 2020-4-13 14:13:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我在写图书馆管理系统

用了GUI和IO。

可是当我新增书籍时
  book_num = Entry()
      book_num.grid(row=2,column=4)
      
      book_name = Entry()
      book_name.grid(row=3,column=4)
      
      book_author = Entry()
      book_author.grid(row=4,column=4)
      
      book_standing= Entry()
      book_standing.grid(row=5,column=4)

      book_total = Entry()
      book_total.grid(row=6,column=4)

      
      def new():#采编入库
            if book_num.get() == ""or book_name.get() == ""or book_author.get()== "" or \
               book_standing.get()== "" or  book_total.get() == "":
                  messagebox.showerror('出错了!','书籍信息未填全')
            else:
                  with open('D:\\Dpan桌面\\B类题\\图书数据.txt','a') as f:
                        content =('\n'+ '书号:%s 书名:%s 箸者:%s 现存量:%s 总库量:%s' % \
                                    (str(book_num.get()),str(book_name.get()),str(book_author.get()), \
               str(book_standing.get()),str(book_total.get())))
                        f.writelines(content)

这一步,我发现如果我再新增一次同样名字的书籍,就无法改变现存量和总库量。
有什么好办法可以再加同名字的书籍时,只改变现存量和总库量吗
最佳答案
2020-4-13 23:32:32
本帖最后由 txxcat 于 2020-4-13 23:37 编辑
Jakcy 发表于 2020-4-13 15:01
好,谢谢老哥,大概明白了!
pandas没学过,可以教一下怎么自己写代码吗。。


你的文件格式不大适合用pandas处理,pandas最好是存成csv格式,象这样:
书号,书名,箸者,现存量,总库量
001,零基础入门学习Python,小甲鱼,22,30
002,Python袖珍指南,Mark Lutz,11,19
我就按你提供的格式来进行处理,文件内容这样:
书号:001 书名:零基础入门学习Python 箸者:小甲鱼 现存量:22 总库量:30
书号:002 书名:Python袖珍指南 箸者:Mark Lutz 现存量:11 总库量:19
代码如下,只是演示,没有容错功能:
#模拟输入,库存假设已经处理为整数
book_num='003'
book_name='零基础入门学习C'
book_author='小甲鱼'
book_standing=10
book_total=10

f=open('图书数据.txt',encoding='utf-8')
allbook=[]
newbook=True
for i in f:
    if book_num==i[3:i.find('书名')].strip():        #如果发现存在,就把库存数字化进行处理后加入列表
        book_standing+=int(i[(i.find('现存量')+4):i.find('总库量')].strip())
        book_total+=int(i[(i.find('总库量')+4):].split('\n')[0].strip())
        content=i[:i.find('现存量')+4]+str(book_standing)+' 总库量:'+str(book_total)+'\n'
        newbook=False       #如果发现存在,则不是新书
    else:
        content =i               #其他没动的直接加入列表
    allbook.append(content)
if newbook:    #如果是新书,加入到列表中
    content =('书号:%s 书名:%s 箸者:%s 现存量:%s 总库量:%s\n' % \
              (book_num,book_name,book_author,book_standing,book_total))
    allbook.append(content)    
f.close()
f=open('图书数据.txt','w',encoding='utf-8')     #覆盖老文件
f.writelines(allbook)                                      #把经过处理的列表写入到文件
f.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-13 14:22:33 | 显示全部楼层
你给的信息不全,不知道问题出在哪儿了
你的程序,现在是通过什么来改变现存量和总库量的?
难道是根据书名?
总库量一个是根据书号来改变吧,每一本书应该有一个书号,书号才应该是唯一识别码吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-13 14:26:06 | 显示全部楼层
sunrise085 发表于 2020-4-13 14:22
你给的信息不全,不知道问题出在哪儿了
你的程序,现在是通过什么来改变现存量和总库量的?
难道是根据书 ...

代码本身没问题,只是想知道怎样可以在下一次新增入库时,直接改变库存、总库存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-13 14:27:13 | 显示全部楼层
sunrise085 发表于 2020-4-13 14:22
你给的信息不全,不知道问题出在哪儿了
你的程序,现在是通过什么来改变现存量和总库量的?
难道是根据书 ...

'\n'+ '书号:%s 书名:%s 箸者:%s 现存量:%s 总库量:%s'  这一句只是把信息写在txt里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 14:28:32 | 显示全部楼层
Jakcy 发表于 2020-4-13 14:26
代码本身没问题,只是想知道怎样可以在下一次新增入库时,直接改变库存、总库存

没说你的代码有问题,只是你提问的时候给的信息不全。
现在根本不知道你的现存量和总库量是是根据什么进行统计的。不知道这个变量是干什么的,怎么知道如何修改?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-13 14:30:19 | 显示全部楼层
sunrise085 发表于 2020-4-13 14:28
没说你的代码有问题,只是你提问的时候给的信息不全。
现在根本不知道你的现存量和总库量是是根据什么进 ...

我也不知道现存量、总库量如何统计,所以想问问老哥怎么弄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 14:41:22 | 显示全部楼层
Jakcy 发表于 2020-4-13 14:30
我也不知道现存量、总库量如何统计,所以想问问老哥怎么弄

你这表达能力堪忧啊。。。
听的还是云里雾里。
不过好像有一点店明白了。
修改总库量和现存量与你这个标出来的红色代码没有关系呗~
看你发出来的代码片段,在new函数上方
book_total 和book_standing这两个量,这不是能获取么?
在new函数内,else中新增数据成功之后,去修改对应的这两个数据不就可以了么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-13 14:43:59 | 显示全部楼层
sunrise085 发表于 2020-4-13 14:41
你这表达能力堪忧啊。。。
听的还是云里雾里。
不过好像有一点店明白了。

好吧。不好意思。可是book_total是Entry出来的对象呀。怎么修改。
而且怎么在txt中修改呢。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 14:53:26 | 显示全部楼层
Jakcy 发表于 2020-4-13 14:43
好吧。不好意思。可是book_total是Entry出来的对象呀。怎么修改。
而且怎么在txt中修改呢。。

Entry出来的数据难道没有来源?是你手动输入的?

txt是在你每次新增一本书的时候都会在后面追加一行?
然后追加的这一行总有书号、书名、箸者、现存量、总库量?
写txt文件的时候直接将book_standing和book_total两个量分别+1是否是你的预期?
content =('\n'+ '书号:%s 书名:%s 箸者:%s 现存量:%s 总库量:%s' % \
                                    (str(book_num.get()),str(book_name.get()),str(book_author.get()), \
               str(book_standing.get()+1),str(book_total.get()+1)))

就这样吧。实在不明白你的问题到底是什么。不管了。你对问题的表述能力太差了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 14:56:07 | 显示全部楼层
你这代码根本没有经过数据处理,只是简单地每次把输入的数据写入到文件中去,自然是没办法自动进行汇总处理的。可以使用pandas,先用pandas读出文件内容,然后输入数据,用pandas处理完之后再写入到文件里去。如果数据量不大,格式相对固定,也可以自己写代码,读出数据,处理数据,写回数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-13 14:59:46 | 显示全部楼层
sunrise085 发表于 2020-4-13 14:53
Entry出来的数据难道没有来源?是你手动输入的?

txt是在你每次新增一本书的时候都会在后面追加一行? ...

好,不好意思,麻烦了!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-13 15:01:13 | 显示全部楼层
txxcat 发表于 2020-4-13 14:56
你这代码根本没有经过数据处理,只是简单地每次把输入的数据写入到文件中去,自然是没办法自动进行汇总处理 ...

好,谢谢老哥,大概明白了!
pandas没学过,可以教一下怎么自己写代码吗。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 23:32:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 txxcat 于 2020-4-13 23:37 编辑
Jakcy 发表于 2020-4-13 15:01
好,谢谢老哥,大概明白了!
pandas没学过,可以教一下怎么自己写代码吗。。


你的文件格式不大适合用pandas处理,pandas最好是存成csv格式,象这样:
书号,书名,箸者,现存量,总库量
001,零基础入门学习Python,小甲鱼,22,30
002,Python袖珍指南,Mark Lutz,11,19
我就按你提供的格式来进行处理,文件内容这样:
书号:001 书名:零基础入门学习Python 箸者:小甲鱼 现存量:22 总库量:30
书号:002 书名:Python袖珍指南 箸者:Mark Lutz 现存量:11 总库量:19
代码如下,只是演示,没有容错功能:
#模拟输入,库存假设已经处理为整数
book_num='003'
book_name='零基础入门学习C'
book_author='小甲鱼'
book_standing=10
book_total=10

f=open('图书数据.txt',encoding='utf-8')
allbook=[]
newbook=True
for i in f:
    if book_num==i[3:i.find('书名')].strip():        #如果发现存在,就把库存数字化进行处理后加入列表
        book_standing+=int(i[(i.find('现存量')+4):i.find('总库量')].strip())
        book_total+=int(i[(i.find('总库量')+4):].split('\n')[0].strip())
        content=i[:i.find('现存量')+4]+str(book_standing)+' 总库量:'+str(book_total)+'\n'
        newbook=False       #如果发现存在,则不是新书
    else:
        content =i               #其他没动的直接加入列表
    allbook.append(content)
if newbook:    #如果是新书,加入到列表中
    content =('书号:%s 书名:%s 箸者:%s 现存量:%s 总库量:%s\n' % \
              (book_num,book_name,book_author,book_standing,book_total))
    allbook.append(content)    
f.close()
f=open('图书数据.txt','w',encoding='utf-8')     #覆盖老文件
f.writelines(allbook)                                      #把经过处理的列表写入到文件
f.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-14 15:21:38 | 显示全部楼层
txxcat 发表于 2020-4-13 23:32
你的文件格式不大适合用pandas处理,pandas最好是存成csv格式,象这样:

我就按你提供的格式来进行 ...

谢谢老哥!明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 12:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表