標籤:python 讀檔案 建立檔案 檔案操作
概述:
本程式主要是模仿《Python核心編程》中3.6節——第一個Python程式,並在其基礎上做了一些小的改進,而改進的要求則是來源於第三章的課後練習題。
本篇部落格的一個核心問題就是在我們如何避免重複製造輪子。
課本來源程式:
這裡不對課本上的來源程式作過多地講解,因為課本本身就說得非常清楚而且易懂。
改進需求:
1. 可以建立新的檔案;
2. 可以讀取新的檔案;
3. 可以讓使用者選擇建立或是讀取檔案.
看到上面的需求,可以你的第一感覺就是,哦,這個太簡單了。不就是把之前寫過的代碼在這裡複製粘貼一下就好了啊,最多不過是多加一個if的判斷,有什麼難的?
當然我並不否認,這的確是一個簡單的程式。不過從優良的代碼品質來看,可不能是簡單的複製和粘貼這麼簡單哦。因為複製代碼到自己的程式中,這會導致代碼的複用性大幅下降,對於小程式可能是沒有什麼影響,可是對於一些龐大的系統來說,這可能是一個致命的傷,因為維護起來可能會異常艱難。好了,說了這麼多,那就來看看我是怎麼解決這個需求的吧。
思路:
我把之前建立檔案和讀取檔案的檔案還是保留,然後在第三個檔案makeNreadTextFile.py中使用代碼去調用前兩個檔案中的方法。
程式碼分析:
makeNreadTextFile.py
#!/usr/bin/env python'makeNreadTextFile.py -- create or read a text file'import subprocess# call makeTextFile.pydef call_make(): cmd = [ "python", "makeTextFile.py"] result = subprocess.call(cmd, 0, None, None, None, None) return result# call readTextFile.pydef call_read(): cmd = [ "python", "readTextFile.py"] result = subprocess.call(cmd, 0, None, None, None, None) return result# get the choose to read or make a text filechoose = raw_input('Enter the choose(r/m)')if choose == 'm': call_make()elif choose == 'M': call_make()elif choose == 'r': call_read()elif choose == 'R': call_read()else: print 'your choose is error!'
大家可以看到上面有幾個地方比較特殊:
1.import subprocess
你百度過後就會知道subprocess是開啟一個新的線程,並與之通訊。
2.result = subprocess.call(cmd, 0, None, None, None, None)
通過1就應該知道,這裡就是正在通訊。
當然,如果只是對書本上的代碼做完整保留,可能達不到我們想要的效果。於是,需要做一些小小的修改。
makeTextFile.py
#!/usr/bin/env python'makeTextFile.py -- create text file'import osls = os.linesepdef make_text_file(): # get filename while True: fname = raw_input('Enter file name:') if os.path.exists(fname): print "ERROR: '%s' already exists" % fname else: break # get file content (text) lines all = [] print "\nEnter lines('.' by iteslf to quit).\n" #loop until user terminates input while True: entry = raw_input('>') if entry == '.': break else: all.append(entry) # write lines to file with proper line-ending fobj = open(fname, 'w') fobj.writelines(['%s%s' % (x, ls) for x in all]) fobj.close() print 'DONE!'if __name__ == "__main__": make_text_file()
readTextFile.py
#!/usr/bin/env Python'readTextFile.py -- read and display text file'def read_text_file(): # get filename fname = raw_input('Enter filename:') # attemp to open file for reading try: fobj = open(fname, 'r') except IOError, e: print "*** file open error:", e else: # display contents to the screen for eachLine in fobj: print eachLine, fobj.close()if __name__ == "__main__": read_text_file()
運行效果:
對“第一個Python程式”的改進