實驗目标: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