实验目标:1)提供一个文件夹浏览框,让用户选择需要打开的文本文件,打开并显示文件内容。
2)当用户点击“OK”按钮的时候,比较当前文件是否被修改过,如果修改过,则提示“覆盖保存”、“放弃保存”或“另存为”并实现其功能。
import easygui as g
import os
file_path = g.fileopenbox(default="e:/pathonaaa/a/")
with open(file_path) as old_file:
#with as语句代替了try finally,自带默认close()功能#
title = os.path.basename(file_path)
msg="文件【%s】的内容如下:" % title
text = old_file.read()
#这个是当前文件打开的内容,注意若文件内有二进制内容,则红字报错#
text_after = g.textbox(msg,title,text)
#如果当前文件在输出框里有变化,那么变化的叫text_after,同时原先的old-file文件在后台关闭#
if text != text_after[:-1]:
#这个是整个程序的精华之处,用这条语句可以检查是否test发生了改变#
choice = g.buttonbox("检测到文件内容发生改变,请选择以下操作:","警告",("覆盖保存","放弃保存","另存为"))
if choice == "覆盖保存":
with open(file_path,"w") as old_file:
#以新写入的方式打开当前的文件#
old_file.write(text_after)
#覆盖写入#
if choice == "放弃保存":
pass
if choice == "另存为":
another_path = g.filesavebox(default=".txt")
#先确定了新文件的路径#
if os.path.splitext(another_path)[1] !=".txt":
#如果新的文件没有保存成txt文件的话#
another_path +=".txt"
#那就在屁股上加上.txt#
with open(another_path,"w") as new_file:
new_file.write(text_after)
============================分割线==============================
if text != text_after[:-1]:
这句话重点分析一下,os里的read()输出是一个大的字符串,那么这个大的"字符串[:-1]"就是一个仅仅少一个最后一个字符而已。
for example:
AAA="阿斯顿飞过规划局" #这是一个字符串#
AAA[:-1]="阿斯顿飞过规划" #少了那个“局”字#
所以可见该程序里text哪怕一个字不动也肯定不等于text_after[:-1],但是在程序中真的一个字也不动却不会触发“!=”,明明少了一个字符,为何还是“==”呢?
原因如下:easygui.textbox函数会在返回的字符串后边追加一个行结束符(“\n”),即print一下就能看见后面多了一个\n,而没有print出来的但是已经被调用的则是单纯的字符串没有\n,如果要比较字符串是否发生了改变我们需要人工的把这个\n给忽略掉。所以说“字符串[-1]”恰好就是这个\n,这里是一个重要的细节。