实验目标:1)提供一个文件夹浏览框,让用户选择需要打开的文本文件,打开并显示文件内容。
2)当用户点击“OK”按钮的时候,比较当前文件是否被修改过,如果修改过,则提示“覆盖保存”、“放弃保存”或“另存为”并实现其功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<code>import</code> <code>easygui as g</code>
<code>import</code> <code>os</code>
<code>file_path </code><code>=</code> <code>g.fileopenbox(default</code><code>=</code><code>"e:/pathonaaa/a/"</code><code>)</code>
<code>with </code><code>open</code><code>(file_path) as old_file:</code>
<code> </code><code>#with as语句代替了try finally,自带默认close()功能#</code>
<code> </code><code>title </code><code>=</code> <code>os.path.basename(file_path)</code>
<code> </code><code>msg</code><code>=</code><code>"文件【%s】的内容如下:"</code> <code>%</code> <code>title</code>
<code> </code><code>text </code><code>=</code> <code>old_file.read()</code>
<code> </code><code>#这个是当前文件打开的内容,注意若文件内有二进制内容,则红字报错#</code>
<code> </code><code>text_after </code><code>=</code> <code>g.textbox(msg,title,text)</code>
<code> </code><code>#如果当前文件在输出框里有变化,那么变化的叫text_after,同时原先的old-file文件在后台关闭#</code>
<code>if</code> <code>text !</code><code>=</code> <code>text_after[:</code><code>-</code><code>1</code><code>]:</code>
<code> </code><code>#这个是整个程序的精华之处,用这条语句可以检查是否test发生了改变#</code>
<code> </code><code>choice </code><code>=</code> <code>g.buttonbox(</code><code>"检测到文件内容发生改变,请选择以下操作:"</code><code>,</code><code>"警告"</code><code>,(</code><code>"覆盖保存"</code><code>,</code><code>"放弃保存"</code><code>,</code><code>"另存为"</code><code>))</code>
<code> </code><code>if</code> <code>choice </code><code>=</code><code>=</code> <code>"覆盖保存"</code><code>:</code>
<code> </code><code>with </code><code>open</code><code>(file_path,</code><code>"w"</code><code>) as old_file:</code>
<code> </code><code>#以新写入的方式打开当前的文件#</code>
<code> </code><code>old_file.write(text_after)</code>
<code> </code><code>#覆盖写入#</code>
<code> </code><code>if</code> <code>choice </code><code>=</code><code>=</code> <code>"放弃保存"</code><code>:</code>
<code> </code><code>pass</code>
<code> </code><code>if</code> <code>choice </code><code>=</code><code>=</code> <code>"另存为"</code><code>:</code>
<code> </code><code>another_path </code><code>=</code> <code>g.filesavebox(default</code><code>=</code><code>".txt"</code><code>)</code>
<code> </code><code>#先确定了新文件的路径#</code>
<code> </code><code>if</code> <code>os.path.splitext(another_path)[</code><code>1</code><code>] !</code><code>=</code><code>".txt"</code><code>:</code>
<code> </code><code>#如果新的文件没有保存成txt文件的话#</code>
<code> </code><code>another_path </code><code>+</code><code>=</code><code>".txt"</code>
<code> </code><code>#那就在屁股上加上.txt#</code>
<code> </code><code>with </code><code>open</code><code>(another_path,</code><code>"w"</code><code>) as new_file:</code>
<code> </code><code>new_file.write(text_after)</code>
============================分割线==============================
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,这里是一个重要的细节。
本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1728566