python核心编程第二版第9章习题答案.docx_第1页
python核心编程第二版第9章习题答案.docx_第2页
python核心编程第二版第9章习题答案.docx_第3页
python核心编程第二版第9章习题答案.docx_第4页
python核心编程第二版第9章习题答案.docx_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

91. 文件过滤. 显示一个文件的所有行, 忽略以井号( # )开头的行. 这个字符被用做Python , Perl, Tcl, 等大多脚本文件的注释符号.附加题: 处理不是第一个字符开头的注释.答案:f = open(test1.txt,r)for eachline in f:if eachline0 = #:continueelif # in eachline:loc = eachline.find(#)print eachline:locelse:print eachline,92. 文件访问. 提示输入数字 N 和文件 F, 然后显示文件 F 的前 N 行.答案:N = int(raw_input(Enter a number: )f = raw_input(Enter filename :)f1 = open(f,r)allline = f1.readlines()f1.close()for i in range(N):print alllinei,93. 文件信息. 提示输入一个文件名, 然后显示这个文本文件的总行数.答案:f = raw_input(Enter filename :)f1 = open(f,r)sum = 0for i in f1:sum += 1print sumf = raw_input(Enter filename :)f1 = open(f,r)sum = 0for i in f1:sum += 1print sum方法二:f = raw_input(Enter filename :)f1 = open(f,r)allline = f1.readlines()f1.close()print len(allline)94. 文件访问. 写一个逐页显示文本文件的程序. 提示输入一个文件名, 每次显示文本文件的 25 行, 暂停并向用户提示按任意键继续., 按键后继续执行.答案:f = raw_input(Enter filename :)f1 = open(f,r)allline = f1.readlines()f1.close()sum = 0for i in allline:print i,sum += 1if sum = 25:a = raw_input(press any key to continue:)sum = 0方法二import os F=raw_input(pls input a file name:) n=0 f=open(F,r) for i in f: print i, n+=1 if n=25: n=0 os.system(pause) f.close() 9-5 考试成绩,改进你的考试成绩问题(练习5-3和6-4),要求能从多个文件中读入考试成绩。文件的数据格式由你自己决定。答案:f = open(test1.txt,r)scores = for i in f:if 0 = int(i.strip()= 100:scores.append(int(i.strip()else:print score wrong ,please againif int(i.strip() 60:print score is E,ielif int(i.strip() 70:print score is D,ielif int(i.strip() 80:print score is C,ielif int(i.strip() 90:print score is B,ielse:print score is A,if.close()print average score is %.2f % (sum(scores)/len(scores)96. 文件比较. 写一个比较两个文本文件的程序. 如果不同, 给出第一个不同处的行号和列号.答案:f1 = raw_input(Enter a filename: )f2 = raw_input(Enter a filename: )F1 = open(f1,r)F2 = open(f2,r)F1allline = F1.readlines()F2allline = F2.readlines()F1.close()F2.close()len1 = len(F1allline)len2 = len(F2allline)minlen1 = min(len1,len2)for i in range(minlen1):print F1alllinei, F2alllineiif F1alllinei != F2alllinei:minlen2 = min(len(F1alllinei),len(F2alllinei)for j in range(minlen2):if F1alllineij != F2alllineij:print row is %d, column is %d % (i+1,j+1)breakelse:continueelse:print they are equaln97. 解析文件. Win32 用户: 创建一个用来解析 Windows .ini 文件的程序. POSIX 用户:创建一个解析 /etc/serves 文件的程序. 其它平台用户: 写一个解析特定结构的系统配置文件的程序.答案:这题没看懂,抄的别人option = f = open(rc:windowswin.ini)for line in f:if line.startswith(;):continueif line.startswith():iterm = name = line1:line.rfind()option.setdefault(name,iterm)continueif = in line:optionname.append(line.strip()print option98. 模块研究. 提取模块的属性资料. 提示用户输入一个模块名(或者从命令行接受输入).然后使用 dir() 和其它内建函数提取模块的属性, 显示它们的名字, 类型, 值.答案:m = raw_input(Enter a module name: )module = _import_(m)m1 = dir(module)print m1for i in m1:print name:,iprint tyoe:,type(getattr(module,i)print value:,getattr(module,i)print99. Python文档字符串。进入Python标准库所在的目录。检查每个 .py 文件看是否有_doc_ 字符串, 如果有, 对其格式进行适当的整理归类. 你的程序执行完毕后, 应该会生成一个漂亮的清单. 里边列出哪些模块有文档字符串, 以及文档字符串的内容. 清单最后附上那些没有文档字符串模块的名字.附加题: 提取标准库中各模块内全部类(class)和函数的文档.答案:这是入口#coding:utf-8import osimport sysnum = 将所有路径文件名全部提取出来def fun(dirName):for i in os.listdir(dirName):if os.path.isdir(dirName + + i):fun(dirName + + i)else:num.append(dirName + + i)fun(rc:python27Lib)hasDoc = FalsestrTemp = fileobj1 = open(hasdoc.txt,a+)fileobj2 = open(nodoc.txt,a+)for i in num:print ifobj = open(i)for eachline in fobj:if (not hasDoc) and eachline.startswith():hasDoc = Trueelif hasDoc and eachline.startswith():hasDoc = FalsestrTemp += eachlinebreakif hasDoc:strTemp += eachlineelse:breakif strTemp != :fileobj1.write(filename: + i + n)fileobj1.write(_doc_ + n)fileobj1.write(strTemp + n)else:fileobj2.write(文件名: + i + n)strTemp = fobj.close()fileobj1.close()fileobj2.close()9-10.家庭理财。创建一个家庭理财程序。你的程序需要处理储蓄、支票、金融市场,定期存款等多种账户。为每种账户提供一个菜单操作界面,要有存款、取款、借、贷等操作。另外还要提供一个取消操作选项。用户退出这个程序时相关数据应该保存到文件里取(出于备份的目的,程序执行过程中也要备份)。答案:太难了,不会。9-11.Web 站点地址.a) 编写一个 URL 书签管理程序. 使用基于文本的菜单, 用户可以添加, 修改或者删除书签数据项. 书签数据项中包含站点的名称, URL 地址, 以及一行简单说明(可选). 另外提供检索功能,可以根据检索关键字在站点名称和 URL 两部分查找可能的匹配. 程序退出时把数据保存到一个磁盘文件中去; 再次执行时候加载保存的数据.b)改进 a) 的解决方案, 把书签输出到一个合法且语法正确的 HTML 文件(.html 或 htm )中,这样用户就可以使用浏览器查看自己的书签清单. 另外提供创建文件夹功能, 对相关的书签进行分组管理.附加题: 请阅读 Python 的 re 模块了解有关正则表达式的资料, 使用正则表达式对用户输入的 URL 进行验证.答案:不会做,参考自import re,osdef checkurl(url):regex = pile(r(?:http|ftp)?:/ #http:/ or https:/r(?:(?:A-Z0-9(?:A-Z0-90,61A-Z0-9)?.)+(?:A-Z2,6.?|A-Z0-9-2,.?)|rlocalhost #localhostrd1,3.d1,3.d1,3.d1,3)r(?:d+)?r(?:/?|/?S+)$, re.IGNORECASE)if regex.match(url):return Trueelse:return Falsedef geturl():name = raw_input(pls input a url name: )while 1:url = raw_input(pls input a url address: )if checkurl(url):breakelse:print wrong url format, pls input againmark = raw_input(pls input a url mark: )folder = raw_input(pls input a url folder: )return (name,url,mark,folder)def load(filename):f = open(filename,a+)bmlist = f.readlines()f.close()return bmlistdef save(bmlist,filename):f = open(filename,w+)for line in bmlist:if len(line):continuef.write(line)f.close()def add(bmlist,name,url,mark,folder = default):bookmark = bookmark = name + ; + url + ; + mark + ; + folder + os.linesepif bookmark not in bmlist:bmlist.append(bookmark)def modify(bmlist,index,name,url,mark,folder):bookmark = bookmark = name + ; + url + ; + mark + ; + folder + os.linesepbmlistindex = bkdef delbm(bmlist,index):bmlist.pop(index)def findbk(bmlist,fname,furl):for i,item in enumerate(bmlist):(name,url,mark,folder) = item.split(;)if fname and furl:if (fname in name) and (furl in url):return iif fname and (fname in name):return iif furl and (furl in url):return ielse:return -1def output2html(bmlist):for i,item in enumerate(bmlist):(name,url,mark,folder) = item.split(;)os.mkdir(folder.strip()filename = name.strip() + .htmlf = open(filename,w+)fmt = %dt%st%st%st%sf.write(bookmark)content = fmt % (i+1,name,rhttp: + url,url,mark,folder)f.write(content)f.write()f.close()os.rename(filename,folder.strip()+os.sep+filename)bmlist = load(url.txt)print bmlistwhile True:print 0. quitprint 1. add a url bookmarkprint 2. modify a url bookmarkprint 3. delete a url bookmarkprint 4. find a url bookmarkprint 5. output url bookmark as htmlprint niInput = input(please input operation num: )if(0 = iInput):save(bmlist,rurl.txt)breakelif (iInput5):print Error input operation,try again. 0 operation is quitncontinueelif 1 = iInput:data = geturl()add(bmlist,*data)print bmlistelif 2 = iInput:index = int(raw_input(bookmark index: )data = geturl()modify(bmlist,index,*data)print bmlistelif 3 = iInput:index = int(raw_input(bookmark index: )delbm(bmlist,index)print bmlistelif 4 = iInput:name = raw_input(url name: )url = raw_input(url address: )index = findbk(bmlist,name,url)if index = -1:print not foundelse:print bmlistindexelif 5 = iInput:output2html(bmlist)9-12 用户名和密码。回顾练习7-5,修改代码使之可以支持“上次登录时间”。请参阅time模块中的文档了解如何记录用户上次登录的时间。另外提供一个系统管理员,他可以导出所有用户的用户名,密码(如需要可以加密),以及上次登录时间。a)数据应保存在磁盘中,使用冒号:分隔,一次写入一行,例如“Joe:boohoo:953176591.145,文件中数据的行数应该等于你系统上的用户数。b)进一步改进你的程序,不再一次写入一行,而使用pickle模块保存整个数据对象。请参阅pickle模块的文档了解如何序列化/扁平化对象,以及如何读写保存的对象。一般来说,这个解决方案的代码行数要比a)少;c)使用shelve模块替换pickle模块,由于可以省去一些维护代码,这个解决方案的代码比b)的更少。答案:from datetime import datetimeimport hashlib,osimport pickle as pimport shelve as sdb = def newuser():value = prompt = login name desired again: while True:name = raw_input(prompt).lower()if not name.isalnum() and in name:print name format errorcontinueelse:if db.has_key(name):prompt = name taken,try another: continueelse:breakpwd = raw_input(login passwd desired: )m = hashlib.md5()m.update(pwd)value.append(m.hexdigest()value.append(datetime.now()dbname = valueprint new user is %s, register time is %s %(name,dbname1)def olduser():name = raw_input(login name desired again: ).lower()pwd = raw_input(login passwd desired: )m = hashlib.md5()m.update(pwd)passwd = db.get(name)if passwd0 = m.hexdigest():newtime = datetime.now()if (newtime - dbname1).days = 0 and (newtime - dbname1).seconds 14400:print you already logged in at %s: %(dbname1)else:passwd1 = newtimeprint welcome back %s, login time is %s %(name,passwd1)else:print login incorrectdef removeuser():print dbname = raw_input(input a user name to remove: ).lower()if name in db:db.pop(name)else:print input errordef userlogin():while True:name = raw_input(login name desired: ).lower()if not name.isalnum() and in name:print name format errorcontinueelse:if not db.has_key(name):print user name is not in dbanswer = raw_input(register a new user? y/n).lower()if y = answer:newuser()breakelif n = answer:breakelse:print user name is already in dbolduser()breakdef outputA():print dbf = open(account.txt,w)for key in db:user = key + : + dbkey0 + : + str(dbkey1) + os.linesepf.write(user)f.close()def outputB():accountfile = pickle.dataf = open(accountfile,w)p.dump(db,f)f.close()f = open(accountfile)accountdb = p.load(f)print accountdbdef outputC():accountfile = shelve.dataaccountdb = s.open(accountfile,c)accountdbdata = dbaccount.close()accountdb = s.open(accountfile,r)print accountdbdatadef adminlogin():while True:name = raw_input(login name desired: ).lower()if not name.isalnum() and in name:print name format errorcontinueelse:pwd = raw_input(login passwd desired: )if name = root and pwd = root:print welcome adminbreakelse:print user name or passwd is wrong,input againif len(db) = 0:print there is nothing you can doelse:answer = raw_input(output all account? y/n).lower()if y = answer:outputC()elif n = answer:print byedef showmenu():prompt = (A)dmin login(U)ser login(R)emove a existing user(Q)uitEnter choice: done = Falsewhile not done:chosen = Falsewhile not chosen:try:choice = raw_input(prompt).strip()0.lower()except (EOFError,keyboardInterrupt):choice = qprint nYou picked: %s % choiceif choice not in aurq:print invalid option.try againelse:chosen = Trueif choice = q:done = Trueif choice = r:removeuser()if choice = u:userlogin()if choice = a:adminlogin()if _name_ = _main_:showmenu()913. 命令行参数a) 什么是命令行参数, 它们有什么用?b) 写一个程序, 打印出所有的命令行参数。答案:a)命令行参数是调用某个程序时除程序名以外的其他参数。命令行参数使程序员在启动一个程序时对程序行为作出选择。b)import sysprint str(sys.argv)9-14 记录结果。修改你的计算器程序(练习5-6)使之接受命令行参数。例如$ calc.py 1 + 2 只输出计算结果。另外,把每个表达式和它的结果写入到一个磁盘文件中,当使用下面的命令时 $ calc.py print 会把记录的内容显示到屏幕上,然后重置文件。这里是样例展示:$ calc.py 1 + 23$ calc.py 3 327$ calc.py print1 + 233 327$ calc.py print$ 答案:#coding:utf-8import sys,osdef calculator(expression):operator = +,-,*,/,%,*sysmol = for i in operator:if i in sys.argv:sysmol = iif sysmol = :print 操作符错误returnnum = expression.split(sysmol)if . in num0 or . in num1:num1 = float(num0)num2 = float(num1)else:num1 = int(num0)num2 = int(num1)f = open(test.txt,a+)f.write(expression)if sysmol = operator0:result = str(num1 + num2) + os.linesepprint result,f.write(result)elif sysmol = operator1:result = str(num1 - num2) + os.linesepprint result,f.write(result)elif sysmol = operator2:result = str(num1 * num2) + os.linesepprint result,f.write(result)elif sysmol = operator3:result = str(num1 / num2) + os.linesepprint result,f.write(result)elif sysmol = operator4:result = str(num1 % num2) + os.linesepprint result,f.write(result)elif sysmol = operator5:result = str(num1 * num2) + os.linesepprint result,f.write(result)if sys.argv1 = print:if os.path.exists(rtest.txt):f = open(test.txt,r)for line in f:print line,f.close()else:print file not exist.else:expression = str(sys.argv1 + + sys.argv2 + + sys.argv3+ os.linesep)calculator(expression)915. 复制文件. 提示输入两个文件名(或者使用命令行参数). 把第一个文件的内容复制到第二个文件中去.答案:import sysfile1 = sys.argv1file2 = sys.argv2f1 = open(file1,r)f2 = open(file2,a+)f2.write(n)for line in f1:f2.write(line)f1.close()f2.close()916. 文本处理。人们输入的文字常常超过屏幕的最大宽度。编写一个程序, 在一个文本文件中查找长度大于 80 个字符的文本行。从最接近 80 个字符的单词断行,把剩余文件插入到下一行处.程序执行完毕后,应该没有超过 80 个字符的文本行了。答案:这个基本能达到要求,不过最后一行会少个字符或结尾符号,因为最后一行没有换行符file = open(test1.txt,r)list1 = for line in file:symbol = Truewhile symbol:if len(line) = 80:list1.append(line:-1)symbol = Falseelse:count = len(line)/80for i in range(count):list1.append(line:81)line = line81:print list1file1 = open(test2.txt,a+)for i in list1:file1.write(i)file1.write(n)方法二:file = open(test1.txt,r)list1 = for line in file:symbol = Truewhile symbol:if len(line) = 80:list1.append(line)symbol = Falseelse:list1.append(line:81)line = line81:print list1file1 = open(test2.txt,a+)for i in list1:if i.endswith(n):i = i:-1file1.write(i)file1.write(n)917. 文本处理。创建一个原始的文本文件编辑器。你的程序应该是菜单驱动的,有如下这些选项:1) 创建文件(提示输入文件名和任意行的文本输入);2) 显示文件(把文件的内容显示到屏幕);3) 编辑文件(提示输入要修改的行, 然后让用户进行修改);4) 保存文件;5) 退出.答案:这里把3编辑文件和4保存文件合并在一起了import osdef newfile():symbol = Truewhile symbol:filename = raw_input(Enter a filename: )if os.path.exists(filename):print file is exists.else:symbol1 = Truewhile symbol1:content = raw_input(Enter content(q for quit): )if content = q:breakf1 = open(filename,a+)f1.write(content)f1.write(n)f1.close()symbol = Falsedef showfile():symbol = Truewhile symbol:filename = raw_input(Enter a filename: )if not os.path.exists(filename):print file is not exists.else:f1 = open(filename,r)for line in f1:print line,f1.close()breakdef editfile():symbol = Truewhile symbol:filename = raw_input(Enter a filename: )if not os.path.exists(filename):print file is not exists.else:index = int(raw_input(edit index of line: )con = raw_input(Enter edit content: )ls = f = open(filename,r)ls = f.readlines()f.close()lsindex - 1 = con + os.linesepf1 = open(filename,w)for line in ls:f1.write(line)f1.close()symbol = Falsedef showmenu():prompt = Menu:(N)ewfile(S)howfile(E)ditfile(Q)uitEnter choice: done = Truewhile done:chosen = Truewhile chosen:try:choice = raw_input(prompt).strip()0.lower()except (EOFError,KeyboardInterrupt):choice = qprint nYou picked: %s % choiceif choice not in ncesq:print invalid option, try againelse:chosen = Falseif choice = q:breakif choice = n:newfile()if choice = s:showfile()if choice = e:editfile()if _name_ = _main_:showmenu()918. 搜索文件. 提示输入一个字节值(0 - 255)和一个文件名. 显示该字符在文件中出现的次数。答案:num = int(raw_input(Enter a number between 0 255: )filename = raw_input(Enter filename: )ch = chr(num)numcount = 0f = open(filename,r)for line in f:numcount += line.count(ch)print numcount919. 创建文件。创建前一个问题的辅助程序。创建一个随机字节的二进制数据文件,但某一特定字节会在文件中出现指定的次数。该程序接受三个参数:1) 一个字节值( 0 - 255 );2) 该字符在数据文件中出现的次数;3) 数据文件的总字节长度。你的工作就是生成这个文件,把给定的字节随机散布在文件里,并且要求保证给定字符在文件中只出现指定的次数,文件应精确地达到要求的长度。答案:import randomdef abc(num, count, len):l = n = len - countfor i in range(n):randomnum = random.randint(0,255)symbol = Truewhile symbol:if randomnum = num:randomnum = random.randint(0,255)else:l.append(randomnum)symbol = Falsefor i in range(count):l.append(num)random.shuffle(l)print lf = open(test.txt,w)f.close()for i in l:f = open(test.txt,a+)f.write(%08d %d % (int(bin(i)2:),i)f.write(n)f.close()print %08d %d % (int(bin(i)2:),i)abc(66,5,20)920.压缩文件。写一小段代码,压缩/解压缩gzip或bzip格式的文件。可以使用命令行下的gzip或bzip2以及GUI程序PowerArchiver,StuffIt,或WinZip来确认你的Python支持这两个库

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论