天天看点

一个“文本文件”打开并且保存多元化的程序细节分析

实验目标: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