chapter 9 exercise

9–1. 文件過濾. 顯示一個文件的全部行, 忽略以井號( # )開頭的行. 這個字符被用作 Python , Perl, Tcl, 等大多腳本文件的註釋符號. 附加題: 處理不是第一個字符開頭的註釋. import os filename=raw_input('please input you file name:') fobj=open(filename,'r') data=[line.strip() for line in fobj.readlines()] fobj.close() print data for string in data:     if string[0]!='#':        print string 9–2. 文件訪問. 提示輸入數字 N 和文件 F, 而後顯示文件 F 的前 N 行. code: import os File=raw_input('please input filename:') Num=int(raw_input('please input the number:')) fobj=open(File,'r') Line=[line.strip() for line in fobj.readlines()] for i in range(Num):     print Line[i] fobj.close() 9–3. 文件信息. 提示輸入一個文件名, 而後顯示這個文本文件的總行數. import os File=raw_input('please input filename:') fobj=open(File) i=0 for line in fobj:     i=i+1 print i fobj.close() another code: import os File=raw_input('please input filename:') fobj=open(File) length=len([line for line in fobj]) print length fobj.close() question:length=len([line for line infobj])爲何只能用列表解析卻不能用生成器表達式(length=len(line for line infobj))解析呢? 9–4. 文件訪問. 寫一個逐頁顯示文本文件的程序. 提示輸入一個文件名, 每次顯示文本 文件的 25 行, 暫停並向用戶提示"按任意鍵繼續.", 按鍵後繼續執行. tips: 讓Python腳本暫停執行的幾種方法求解, 2. raw_input( ) 經過等待輸入來讓程序暫停 3. os.system("pause") 經過執行操做系統的命令來讓程序暫停,該函數是經過實現標準C函數system( )來實現的。 code: import os def showTextPage(filename):     f=open(filename)     n=0     for eachline in f:        print eachline        n=n+1        if n%==0:                      os.system('pause')           continue     f.close() filename=raw_input('please input filename:') showTextPage(filename) 9–5. kaoshi成績. 改進你的kaoshi成績問題(練習 5 -3 和 6-4), 要求能從多個文件中讀入kaoshi成績. 文件的數據格式由你本身決定. 難點:多個文件中讀取。 code: 5-3 標準類型運算符. 寫一段腳本,輸入一個測驗成績,根據下面的標準,輸出他的評分 成績(A-F)。 A: 90–100 B: 80–89 C: 70–79 D: 60–69 F: <60 術. 更新上一章裏面你的得分測試練習方案,把測試得分放到一個列表中去.你的代 碼應該能夠計算出一個平均分 9–6. 文件比較. 寫一個比較兩個文本文件的程序. 若是不一樣, 給出第一個不一樣處的行號和 列號. filename1=raw_input('please input file1;') filename2=raw_input('please input file2:') fobj1=open(filename1) fobj2=open(filename2) def compareline(line1,line2):     t=len(lene1) iflen(line1)     for j in range(t):        if line1[j]!=line2[j]:            print'j islist%d' %(j+1)           break def textCompare(fobj1,fobj2):    line1=fobj1.readlines()    line2=fobj2.readlines()     for i inrange(len(line1)):        if line1[i]!=line2[i]:            print 'iis row%d'%(i+1)           compareline(line1[i],line2[i])           break     else:        print 'exactly the same.' textCompare(fobj1,fobj2) fobj1.close() fobj2.close() 9–7. 解析文件. Win32 用戶: 建立一個用來解析 Windows .ini 文件的程序. POSIX用戶: 建立一個解析 /etc/serves 文件的程序. 其它平臺用戶: 寫一個解析特定結構的系統配置文件的 程序. code: def parseIni(filename):     f=open(filename)     dict1={}     for eachLine in f:        index=eachLine.find('=')        if index!=-1:           key=eachLine[:index].strip()           value=eachLine[index+1:].strip()           dict1[key]=value     for key in dict1:        print key,'=',dict1[key]     f.close() parseIni('system.ini') 9–8. 模塊研究. 提取模塊的屬性資料. 提示用戶輸入一個模塊名(或者從命令行接受輸入). 而後使用 dir() 和其它內建函數提取模塊的屬性, 顯示它們的名字, 類型, 值. code: 暫時還沒搞懂 import os module=raw_input('please input the module name:') def getattribute(module):     a=help(module)    f=open('module.txt','w')    f.write('%s%s'%(a,os.linesep))     f.close() getattribute(module) 9–9. Python 文檔字符串. 進入 Python 標準庫所在的目錄. 檢查每一個 .py 文件看是否有 __doc__ 字符串, 若是有, 對其格式進行適當的整理歸類. 你的程序執行完畢後, 應該會生成一個 漂亮的清單. 裏邊列出哪些模塊有文檔字符串, 以及文檔字符串的內容. 清單最後附上那些沒有文 檔字符串模塊的名字. 附加題: 提取標準庫中各模塊內所有類(class)和函數的文檔. import os import sys path=r'C:\Python27\Lib\aifc.py' fileobj1=open('docstring.txt','a+') fobj=open(path) strTemp='' hasDoc=False for eachline in fobj:     if (not hasDoc) andeachline.startswith('"""'):        hasDoc = True     elif hasDoc andeachline.startswith('"""'):        hasDoc = False        strTemp += eachline        break     if hasDoc:        strTemp += eachline     else:        break if strTemp != "":         fileobj1.write("filename:"+os.linesep)         fileobj1.write("__doc__ is:" +os.linesep)         fileobj1.write(strTemp +os.linesep) strTemp = "" fobj.close() fileobj1.close() 9–13. 命令行參數 a) 什麼是命令行參數, 它們有什麼用? b) 寫一個程序, 打印出全部的命令行參數. 命令行參數是指經過命令行傳入的參數。sys.argv,當你在文本環境下編寫代碼須要在cmd下運行時必須經過命令行參數向程序傳輸參數。 命令行參數是調用某個程序時除程 序名之外的其它參數 import sys for i in range(1,len(sys.argv)):     printi,sys.argv[i] 經過cmd執行該程序並輸入參數。 9–14. 記錄結果. 修改你的計算器程序(練習 5-6 )使之接受命令行參數. 例如: $ calc.py 1 + 2 只輸出計算結果. 另外, 把每一個表達式和它的結果寫入到一個磁盤文件中. 當使用下面的命令 時: $ calc.py print Edit By Vheavens Edit By Vheavens 會把記錄的內容顯示到屏幕上, 而後重置文件. 這裏是樣例展現: import os import sys def count(express):     for a in express:        i=express.index(a)        if a=='+':            returnint(express[:i])+ int(express[i+1:])        elif  a=='-':            returnint(express[:i])- int(express[i+1:])        elif a=='*':            returnint(express[:i])* int(express[i+1:])        elif a=='/'and int(express[i+1:])!=0:            returnint(express[:i])/ int(express[i+1:])        elif a=='%'and int(express[i+1:])!=0:            returnint(express[:i])% int(express[i+1:])        elif a=='**'and int(express[i+1:])!=0:            returnint(express[:i])** int(express[i+1:])     else:        return 'invalue express,please inputagain' if __name__=='__main__':    express=sys.argv[1]     if express=='print':        with open('result.txt') as fobj:            printfobj.read()        os.remove('result.txt')     else:        with open('result.txt','a+') as fobj:           fobj.write(sys.argv[1])           fobj.write('='+str(count(sys.argv[1])))           fobj.write('\n')     print 'the resultis:%d'%(count(sys.argv[1])) 9–15. 複製文件. 提示輸入兩個文件名(或者使用命令行參數). 把第一個文件的內容複製 到第二個文件中去. code: import sys import os file1=raw_input('please input filename:') file2=raw_input('please input filename2:') fobj1=open(file1) fobj2=open(file2,'w') for eachline in fobj1:    fobj2.write(eachline+os.linesep) fobj1.close() fobj2.close() code2:用sys.argv傳遞參數 import sys import os #file1=raw_input('please input filename:') #file2=raw_input('please input filename2:') fobj1=open(sys.argv[1]) fobj2=open(sys.argv[2],'w') for eachline in fobj1:    fobj2.write(eachline+os.linesep) fobj1.close() fobj2.close() 9–16. 文本處理. 人們輸入的文字經常超過屏幕的最大寬度. 編寫一個程序, 在一個文本 文件中查找長度大於 80 個字符的文本行. 從最接近 80 個字符的單詞斷行, 把剩餘文件插入到 下一行處. 程序執行完畢後, 應該沒有超過 80 個字符的文本行了. code: import sys import os with open('newfile.txt') as fobj:     withopen('temp.txt','w')as fobj2:        for eachline in fobj:            iflen(eachline)>80:              eachline1=list(eachline)               num=len(eachline1)/80               for i in range(num):                  fobj2.write(''.join(eachline[:79]))                  fobj2.write(os.linesep)                  eachline=eachline[79:]              fobj2.write(''.join(eachline))           else:              fobj2.write(eachline+os.linesep)     fobj2.close()     fobj.close() 這個代碼有個問題就是有的時候那個一行末尾的單詞會被截斷,再kaolv一個。kaolv到這個我忽然想到在第八章裏面有個表達式解析好像有這個方法, 去回顧一下去。 附加題: 須要計算出全部非空白字符的數目。 And the Lord spake, saying, "First shalt thou take out the Holy Pin. Then shalt thou count to three, Edit By Vheavens Edit By Vheavens no more, no less. Three shall be the number thou shalt count, and the number of the counting shall be three. Four shalt thou not count, nei- ther count thou two, excepting that thou then proceed to three. Five is right out. Once the number three, being the third number, be reached, then lobbest thou thy Holy Hand Grenade of Antioch towards thy foe, who, being naughty in My sight, shall snuff it." code: f = open('hhga.txt', 'r') sum=len([word for line in f for word in line.split()]) 9–17. 文本處理. 建立一個原始的文本文件編輯器. 你的程序應該是菜單驅動的, 有以下 這些選項: 1) 建立文件(提示輸入文件名和任意行的文本輸入), 2) 顯示文件(把文件的內容顯示到屏幕), 3) 編輯文件(提示輸入要修改的行, 而後讓用戶進行修改), 4) 保存文件, 以及 5) 退出. code: 9–18. 搜索文件. 提示輸入一個字節值(0 - 255)和一個文件名. 顯示該字符在文件中出現 的次數. code: chr=raw_input('please input character:') filename=raw_input('please input filename:') fobj=open(filename) j=0 for eachline in fobj:    list1=list(eachline)     for i inrange(len(list1)):        if chr==list1[i]:           j=j+1 fobj.close() print j 或者使用字符串計數函數;string.count(chr) chr=raw_input('please input character:') filename=raw_input('please input filename:') fobj=open(filename) j=0 for eachline in fobj:    j=j+eachline.count(chr) fobj.close() print j 9–19. 建立文件. 建立前一個問題的輔助程序. 建立一個隨機字節的二進制數據文件, 但 某一特定字節會在文件中出現指定的次數. 該程序接受三個參數: 1) 一個字節值( 0 - 255 ), 2) 該字符在數據文件中出現的次數, 以及 3) 數據文件的總字節長度. 你的工做就是生成這個文件, 把給定的字節隨機散佈在文件裏, 而且要求保證給定字符在文件 中只出現指定的次數, 文件應精確地達到要求的長度. code: import os import random def fun(chr,countNum,length):     num=[]     firstlength=length     whilefirstlength-countNum:        char=random.choice(xrange(255))        num.append(char)        firstlength=firstlength-1     for i inrange(countNum):        num.append(chr)    random.shuffle(num)     return num if __name__=='__main__':     while True:        chr=int(raw_input('please input the charter youwant to(0 to quit) :'))        countNum=int(raw_input('please input thetimes:'))        length=int(raw_input('please input the totalltimes'))        if chr==0:           break        elif length            print'wrong ,please input again'           break        else:           num=fun(chr,countNum,length)            for i innum:               print '{0:b}'.format(i) 9–20. 壓縮文件. 寫一小段代碼, 壓縮/解壓縮 gzip 或 bzip 格式的文件. 可使用命令 行下的 gzip 或 bzip2 以及 GUI 程序 PowerArchiver , StuffIt , 或 WinZip來確認你的 Python 支持這兩個庫. code: import zipfile with zipfile.ZipFile('hello.zip','w')as myzip:    myzip.write('text.txt') ////////////////////////////////////// import zipfile f=zipfile.ZipFile('text.zip','w') f.write('text.txt') f.write('temp.txt') f.close() /////////////////////////////// 9–21. ZIP 歸檔文件. 建立一個程序, 能夠往 ZIP 歸檔文件加入文件, 或從中提取文件, 有可能的話, 加入建立ZIP 歸檔文件的功能.
相關文章
相關標籤/搜索