当前位置:首页 >> 理学 >>

python核心编程第二版第9章习题答案


9–1. 文件过滤. 显示一个文件的所有行, 忽略以井号( # )开头的行. 这个字符被用做 Python , Perl, Tcl, 等大多脚本文件的注释符号.附加题: 处理不是第一个字符开头的注释. 答案: f = open('test1.txt','r') for eachline in f: if eachline[0] == '#': continue elif '#' in eachline: loc = eachline.find('#') print eachline[:loc] else: print eachline, 9–2. 文件访问. 提示输入数字 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 allline[i], 9–3. 文件信息. 提示输入一个文件名, 然后显示这个文本文件的总行数. 答案: f = raw_input('Enter filename :') f1 = open(f,'r') sum = 0 for i in f1: sum += 1 print sumf = raw_input('Enter filename :') f1 = open(f,'r') sum = 0 for i in f1: sum += 1 print sum 方法二: f = raw_input('Enter filename :') f1 = open(f,'r') allline = f1.readlines() f1.close() print len(allline) 9–4. 文件访问. 写一个逐页显示文本文件的程序. 提示输入一个文件名, 每次显示文本文 件的 25 行, 暂停并向用户提示"按任意键继续.", 按键后继续执行.

答案: f = raw_input('Enter filename :') f1 = open(f,'r') allline = f1.readlines() f1.close() sum = 0 for i in allline: print i, sum += 1 if 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 again' if int(i.strip()) < 60: print 'score is E',i elif int(i.strip()) < 70: print 'score is D',i elif int(i.strip()) < 80: print 'score is C',i elif int(i.strip()) < 90: print 'score is B',i else:

print 'score is A',i f.close() print 'average score is %.2f' % (sum(scores)/len(scores)) 9–6. 文件比较. 写一个比较两个文本文件的程序. 如果不同, 给出第一个不同处的行号和 列号. 答案: 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 F1allline[i], F2allline[i] if F1allline[i] != F2allline[i]: minlen2 = min(len(F1allline[i]),len(F2allline[i])) for j in range(minlen2): if F1allline[i][j] != F2allline[i][j]: print 'row is %d, column is %d' % (i+1,j+1) break else: continue else: print 'they are equal\n' 9–7. 解析文件. Win32 用户: 创建一个用来解析 Windows .ini 文件的程序. POSIX 用户:创 建一个解析 /etc/serves 文件的程序. 其它平台用户: 写一个解析特定结构的系统配置文件 的程序. 答案:这题没看懂,抄的别人 option = {} f = open(r'c:\windows\win.ini') for line in f: if line.startswith(';'): continue if line.startswith('['): iterm = [] name = line[1:line.rfind(']')] option.setdefault(name,iterm) continue

if '=' in line: option[name].append(line.strip()) print option 9–8. 模块研究. 提取模块的属性资料. 提示用户输入一个模块名(或者从命令行接受输入). 然后使用 dir() 和其它内建函数提取模块的属性, 显示它们的名字, 类型, 值. 答案: m = raw_input('Enter a module name: ') module = __import__(m) m1 = dir(module) print m1 for i in m1: print 'name:',i print 'tyoe:',type(getattr(module,i)) print 'value:',getattr(module,i) print 9–9. Python 文档字符串。进入 Python 标准库所在的目录。检查每个 .py 文件看是否有 __doc__ 字符串, 如果有, 对其格式进行适当的整理归类. 你的程序执行完毕后, 应该会生 成一个漂亮的清单. 里边列出哪些模块有文档字符串, 以及文档字符串的内容. 清单最后附 上那些没有文档字符串模块的名字.附加题: 提取标准库中各模块内全部类(class)和函数的文 档. 答案:这是入口 #coding:utf-8 import os import sys num = [] '''将所有路径文件名全部提取出来''' def fun(dirName): for i in os.listdir(dirName): if os.path.isdir(dirName + "\\" + i): fun(dirName + '\\' + i) else: num.append(dirName + '\\' + i) fun(r'c:\python27\Lib') hasDoc = False strTemp = '' fileobj1 = open('hasdoc.txt','a+') fileobj2 = open('nodoc.txt','a+') for i in num: print i fobj = open(i) for eachline in fobj: if (not hasDoc) and eachline.startswith('"""'):

hasDoc = True elif hasDoc and eachline.startswith('"""'): hasDoc = False strTemp += eachline break if hasDoc: strTemp += eachline else: break if 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,os def checkurl(url): regex = re.compile( r'^(?:http|ftp)?://' #http:// or https:// r'(?:(?:[A-Z0-9](?:[A-Z0-9]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' r'localhost' #localhost

r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' r'(?::\d+)?' r'(?:/?|[/?]\S+)$', re.IGNORECASE) if regex.match(url): return True else: return False def geturl(): name = raw_input('pls input a url name: ') while 1: url = raw_input('pls input a url address: ') if checkurl(url): break else: print 'wrong url format, pls input again' mark = 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 bmlist def save(bmlist,filename): f = open(filename,'w+') for line in bmlist: if len(line): continue f.write(line) f.close() def add(bmlist,name,url,mark,folder = 'default'): bookmark = '' bookmark = name + ';' + url + ';' + mark + ';' + folder + os.linesep if bookmark not in bmlist: bmlist.append(bookmark) def modify(bmlist,index,name,url,mark,folder): bookmark = '' bookmark = name + ';' + url + ';' + mark + ';' + folder + os.linesep bmlist[index] = bk

def 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 i if fname and (fname in name): return i if furl and (furl in url): return i else: return -1 def output2html(bmlist): for i,item in enumerate(bmlist): (name,url,mark,folder) = item.split(';') os.mkdir(folder.strip()) filename = name.strip() + '.html' f = open(filename,'w+') fmt = '%d\t%s\t<a href=%s>%s</a>\t%s\t%s<br>' f.write('<html><head><title>bookmark</title></head><body>') content = fmt % (i+1,name,r'http:\\' + url,url,mark,folder) f.write(content) f.write('</body></html>') f.close() os.rename(filename,folder.strip()+os.sep+filename) bmlist = load('url.txt') print bmlist while True: print '0. quit' print '1. add a url bookmark' print '2. modify a url bookmark' print '3. delete a url bookmark' print '4. find a url bookmark' print '5. output url bookmark as html' print '\n' iInput = input('please input operation num: ') if(0 == iInput):

save(bmlist,r'url.txt') break elif (iInput<0 or iInput>5): print 'Error input operation,try again. 0 operation is quit\n' continue elif 1 == iInput: data = geturl() add(bmlist,*data) print bmlist elif 2 == iInput: index = int(raw_input('bookmark index: ')) data = geturl() modify(bmlist,index,*data) print bmlist elif 3 == iInput: index = int(raw_input('bookmark index: ')) delbm(bmlist,index) print bmlist elif 4 == iInput: name = raw_input('url name: ') url = raw_input('url address: ') index = findbk(bmlist,name,url) if index == -1: print 'not found' else: print bmlist[index] elif 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 datetime import hashlib,os import pickle as p import shelve as s

db = {} 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 error' continue else: if db.has_key(name): prompt = 'name taken,try another: ' continue else: break pwd = raw_input('login passwd desired: ') m = hashlib.md5() m.update(pwd) value.append(m.hexdigest()) value.append(datetime.now()) db[name] = value print 'new user is %s, register time is %s' %(name,db[name][1]) 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 passwd[0] == m.hexdigest(): newtime = datetime.now() if (newtime - db[name][1]).days == 0 and (newtime - db[name][1]).seconds < 14400: print 'you already logged in at %s: ' %(db[name][1]) else: passwd[1] = newtime print 'welcome back %s, login time is %s' %(name,passwd[1]) else: print 'login incorrect' def removeuser(): print db name = raw_input('input a user name to remove: ').lower()

if name in db: db.pop(name) else: print 'input error' def userlogin(): while True: name = raw_input('login name desired: ').lower() if not name.isalnum() and '' in name: print 'name format error' continue else: if not db.has_key(name): print 'user name is not in db' answer = raw_input('register a new user? y/n').lower() if 'y' == answer: newuser() break elif 'n' == answer: break else: print 'user name is already in db' olduser() break def outputA(): print db f = open('account.txt','w') for key in db: user = key + ':' + db[key][0] + ':' + str(db[key][1]) + os.linesep f.write(user) f.close() def outputB(): accountfile = 'pickle.data' f = open(accountfile,'w') p.dump(db,f) f.close() f = open(accountfile) accountdb = p.load(f) print accountdb def outputC():

accountfile = 'shelve.data' accountdb = s.open(accountfile,'c') accountdb['data'] = db account.close() accountdb = s.open(accountfile,'r') print accountdb['data'] def adminlogin(): while True: name = raw_input('login name desired: ').lower() if not name.isalnum() and '' in name: print 'name format error' continue else: pwd = raw_input('login passwd desired: ') if name == 'root' and pwd == 'root': print 'welcome admin' break else: print 'user name or passwd is wrong,input again' if len(db) == 0: print 'there is nothing you can do' else: answer = raw_input('output all account? y/n').lower() if 'y' == answer: outputC() elif 'n' == answer: print 'bye' def showmenu(): prompt = ''' (A)dmin login (U)ser login (R)emove a existing user (Q)uit Enter choice: ''' done = False while not done: chosen = False while not chosen: try: choice = raw_input(prompt).strip()[0].lower()

except (EOFError,keyboardInterrupt): choice = 'q' print '\nYou picked: [%s]' % choice if choice not in 'aurq': print 'invalid option.try again' else: chosen = True if choice == 'q': done = True if choice == 'r': removeuser() if choice == 'u': userlogin() if choice == 'a': adminlogin() if __name__ == '__main__': showmenu() 9–13. 命令行参数 a) 什么是命令行参数, 它们有什么用? b) 写一个程序, 打印出所有的命令行参数。 答案: a)命令行参数是调用某个程序时除程序名以外的其他参数。 命令行参数使程序员在启动一个 程序时对程序行为作出选择。 b) import sys print str(sys.argv) 9-14 记录结果。修改你的计算器程序(练习 5-6)使之接受命令行参数。例如$ calc.py 1 + 2 只输出计算结果。另外,把每个表达式和它的结果写入到一个磁盘文件中,当使用下面的命 令时 $ calc.py print 会把记录的内容显示到屏幕上,然后重置文件。这里是样例展示: $ calc.py 1 + 2 3 $ calc.py 3 ^ 3 27 $ calc.py print 1+2 3 3^3 27 $ calc.py print $

答案: #coding:utf-8 import sys,os def calculator(expression): operator = ['+','-','*','/','%','**'] sysmol = '' for i in operator: if i in sys.argv: sysmol = i if sysmol == '': print '操作符错误' return num = expression.split(sysmol) if '.' in num[0] or '.' in num[1]: num1 = float(num[0]) num2 = float(num[1]) else: num1 = int(num[0]) num2 = int(num[1]) f = open('test.txt','a+') f.write(expression) if sysmol == operator[0]: result = str(num1 + num2) + os.linesep print result, f.write(result) elif sysmol == operator[1]: result = str(num1 - num2) + os.linesep print result, f.write(result) elif sysmol == operator[2]: result = str(num1 * num2) + os.linesep print result, f.write(result) elif sysmol == operator[3]: result = str(num1 / num2) + os.linesep print result, f.write(result) elif sysmol == operator[4]: result = str(num1 % num2) + os.linesep print result,

f.write(result) elif sysmol == operator[5]: result = str(num1 ** num2) + os.linesep print result, f.write(result) if sys.argv[1] == 'print': if os.path.exists(r'test.txt'): f = open('test.txt','r') for line in f: print line, f.close() else: print 'file not exist.' else: expression = str(sys.argv[1] + ' ' + sys.argv[2] + ' ' + sys.argv[3]\ + os.linesep) calculator(expression) 9–15. 复制文件. 提示输入两个文件名(或者使用命令行参数). 把第一个文件的内容复制到 第二个文件中去. 答案: import sys file1 = sys.argv[1] file2 = sys.argv[2] f1 = open(file1,'r') f2 = open(file2,'a+') f2.write('\n') for line in f1: f2.write(line) f1.close() f2.close() 9–16. 文本处理。人们输入的文字常常超过屏幕的最大宽度。编写一个程序, 在一个文本 文件中查找长度大于 80 个字符的文本行。 从最接近 80 个字符的单词断行, 把剩余文件插 入到下一行处.程序执行完毕后,应该没有超过 80 个字符的文本行了。 答案:这个基本能达到要求,不过最后一行会少个字符或结尾符号,因为最后一行没有换行 符 file = open('test1.txt','r') list1 = [] for line in file: symbol = True

while symbol: if len(line) <= 80: list1.append(line[:-1]) symbol = False else: count = len(line)/80 for i in range(count): list1.append(line[:81]) line = line[81:] print list1 file1 = 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 = True while symbol: if len(line) <= 80: list1.append(line) symbol = False else: list1.append(line[:81]) line = line[81:] print list1 file1 = open('test2.txt','a+') for i in list1: if i.endswith('\n'): i = i[:-1] file1.write(i) file1.write('\n') 9–17. 文本处理。创建一个原始的文本文件编辑器。你的程序应该是菜单驱动的,有如下 这些选项: 1) 创建文件(提示输入文件名和任意行的文本输入); 2) 显示文件(把文件的内容显示到屏幕); 3) 编辑文件(提示输入要修改的行, 然后让用户进行修改); 4) 保存文件; 5) 退出. 答案:这里把 3 编辑文件和 4 保存文件合并在一起了 import os

def newfile(): symbol = True while symbol: filename = raw_input('Enter a filename: ') if os.path.exists(filename): print 'file is exists.' else: symbol1 = True while symbol1: content = raw_input('Enter content("q" for quit): ') if content == 'q': break f1 = open(filename,'a+') f1.write(content) f1.write('\n') f1.close() symbol = False def showfile(): symbol = True while 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() break def editfile(): symbol = True while 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()

ls[index - 1] = con + os.linesep f1 = open(filename,'w') for line in ls: f1.write(line) f1.close() symbol = False def showmenu(): prompt = ''' Menu: (N)ewfile (S)howfile (E)ditfile (Q)uit Enter choice: ''' done = True while done: chosen = True while chosen: try: choice = raw_input(prompt).strip()[0].lower() except (EOFError,KeyboardInterrupt): choice = 'q' print '\nYou picked: [%s]' % choice if choice not in 'ncesq': print 'invalid option, try again' else: chosen = False if choice == 'q':break if choice == 'n':newfile() if choice == 's':showfile() if choice == 'e':editfile() if __name__ == '__main__': showmenu() 9–18. 搜索文件. 提示输入一个字节值(0 - 255)和一个文件名. 显示该字符在文件中出现的 次数。 答案: num = int(raw_input('Enter a number between 0 ~ 255: '))

filename = raw_input('Enter filename: ') ch = chr(num) numcount = 0 f = open(filename,'r') for line in f: numcount += line.count(ch) print numcount 9–19. 创建文件。创建前一个问题的辅助程序。创建一个随机字节的二进制数据文件,但 某一特定字节会在文件中出现指定的次数。该程序接受三个参数: 1) 一个字节值( 0 - 255 ); 2) 该字符在数据文件中出现的次数; 3) 数据文件的总字节长度。 你的工作就是生成这个文件, 把给定的字节随机散布在文件里, 并且要求保证给定字符在文 件中只出现指定的次数,文件应精确地达到要求的长度。 答案: import random def abc(num, count, len): l = [] n = len - count for i in range(n): randomnum = random.randint(0,255) symbol = True while symbol: if randomnum == num: randomnum = random.randint(0,255) else: l.append(randomnum) symbol = False for i in range(count): l.append(num) random.shuffle(l) print l f = 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) 9–20.压缩文件。写一小段代码,压缩/解压缩 gzip 或 bzip 格式的文件。可以使用命令行下 的 gzip 或 bzip2 以及 GUI 程序 PowerArchiver,StuffIt,或 WinZip 来确认你的 Python 支持这 两个库。 答案:压缩/解压缩 import gzip f_in = open('test.txt', 'rb') f_out = gzip.open('test.txt.gz', 'wb') f_out.writelines(f_in) f_out.close() f_in.close() import gzip f = gzip.open('test.txt.gz', 'rb') f_out = open('test3.txt','wb') file_content = f.read() f_out.write(file_content) f.close() f_out.close() 9–21.ZIP 归档文件。创建一个程序,可以往 ZIP 归档文件加入文件,或从中提取文件,有可 能的话,加入创建 ZIP 归档文件的功能。 答案: #!/usr/bin/env python import zipfile z = zipfile.ZipFile('1_copy.txt.zip', mode = 'a') z.write('test2.txt') z.close() 答案: import zipfile #创建压缩文件 def create_zipfile(zipname,filename1,filename2): z=zipfile.ZipFile(zipname,'w') z.write(filename1) z.write(filename2) z.close() #追加文件到压缩文件中 def add_zipfile(zipname,filename): z=zipfile.ZipFile(zipname,'a') z.write(filename) z.close() #提取文件 def extract_zipfile(zipname,filename):

z=zipfile.ZipFile(zipname,'r') z.extract(filename) z.close() if __name__=='__main__': create_zipfile(r'test.zip',r'test.txt',r'test1.txt') add_zipfile(r'test.zip',r'test2.txt') extract_zipfile(r'test.zip',r'test.txt') 9–22.ZIP 归档文件。 unzip -l 命令显示出的 ZIP 归档文件很无趣。 创建一个 Python 脚本 lszip.py, 使它可以显示额外信息:压缩文件大小,每个文件的压缩比率(通过比较压缩前后文件大小), 以及完成的 time.ctime()时间戳,而不是只有日期和 HH:MM。 提示:归档文件的 date_time 属性并不完整,无法提供给 time.mktime()使用....这由你自己决 定。 答案: import zipfile,time filename = raw_input('Enter filename: ') z1 = zipfile.ZipFile(filename,'r') for i in z1.infolist(): t = time.ctime(time.mktime(tuple(list(i.date_time) + [0,0,0]))) try: compress_percent = float(i.compress_size)/i.file_size * 100 print '%s\t%d\t%d\t%.2f%%\t%s\t' % (i.filename, i.compress_size, i.file_size,\ compress_percent, t) except: print '%s is null' % i.filename 9–23.TAR 归档文件。为 TAR 归档文件建立类似上个问题的程序。这两种文件的不同之处在 于 ZIP 文件通常是压缩的,而 TAR 文件不是,只是在 gzip 和 bzip2 的支持下才能完成压缩工 作。 加入任意一种压缩格式支持。 附加题: 同时支持 gzip 和 bzip2。 import tarfile tar = tarfile.open('tar_file.tar','w') tar.add('test1.txt') tar.close() tar = tarfile.open('tar_file1.tar.gz','w:gz') tar.add('test2.txt') tar.close() tar = tarfile.open('tar_file2.tar.bz2','w|bz2') tar.add('test.txt')

tar.close() 解压 tar import tarfile tar = tarfile.open('tar_file.tar','r') tar.extractall() tar.close() 9–24. 归档文件转换。参考前两个问题的解决方案,写一个程序,在 ZIP(.zip)和 TAR/gzip(.tgz/.tar.gz)或 TAR/bzip2(.tbz/.tar.bz2)归档文件间移动文件。文件可能是已经存在的, 必要时请创建文件。 答案: import tarfile, zipfile def movefile(compressfile1,compressfile2,filename): type1 = compressfile1.split('.', 1) type2 = compressfile2.split('.', 1) if type1[1] == 'zip': z = zipfile.ZipFile(compressfile1, 'r') if filename not in z.namelist(): print '%s is not found %s' % (compressfile1, filename) return else: z.extract(filename) z.close() else: mode = 'r:gz' if type1[1][-2:] == 'gz' else 'r:bz2' z = tarfile.open(compressfile1, mode) if filename not in z.getnames(): print '%s is not found %s' % (compressfile1, filename) return else: z.extract(filename) z.close() if type2[1] == 'zip': z = zipfile.ZipFile(compressfile2, 'a') if filename in z.namelist(): print '%s is exist in %s' % (filename, compressfile2) else: z.write(filename) print 'file add success' z.close() else: filelist = []

z = tarfile.open(compressfile2, 'r') file = z.getnames() for i in file: filelist.append(i) if filename in z.getnames(): print '%s is exist in %s' % (filename, compressfile2) z.close() else: mode = 'w:gz' if type2[1][-2:] == 'gz' else 'w:bz2' z.close() z = tarfile.open(compressfile2, mode) filelist.append(filename) for file in filelist: z.add(file) z.close() print 'add success' movefile('tesw.zip', 'tar_file2.tar.bz2', 'url.txt') movefile('tesw.zip', 'tar_file1.tar.gz', 'test1.txt') movefile('tar_file1.tar.gz', 'tesw.zip', 'test.txt') movefile('tar_file2.tar.bz2', 'test1.zip', 'test1.txt') 9–25. 通用解压程序。创建一个程序,接受任意数目的归档文件以及一个目标目录做为参 数。归档文件格式可以是.zip、.tgz、.tar.gz、.gz、.bz2、.tar.bz2、.tbz 中的一种或几种。程序 会把第一个归档文件解压后放入目标目录, 把其它归档文件解压后放入以对应文件名命名的 目录下(不包括扩展名)。例如输入的文件名为 header.txt.gz 和 data.tgz,目录为 incoming, header.txt 会被解压到 incoming 而 data.tgz 中的文件会被放入 incoming/data。 import tarfile import zipfile import os def extract(path,filename): endlist = ['tgz','tar.gz','gz','bz2','tar.bz2','tbz'] filesplit = filename.split('.',1) if filename.endswith('.zip'): z = zipfile.ZipFile(filename,'r') z.extractall(path) elif filesplit[1] in endlist: z = tarfile.open(filename,'r') z.extractall(path) def decompress(target, *filenames): if not os.path.exists(target): os.mkdir(target)

extract(target,filenames[0]) for name in filenames[1:]: dirname = os.path.splitext(os.path.basename(name))[0] dirname = target + '\\' + dirname os.mkdir(dirname) extract(dirname,name) if __name__ == '__main__': os.chdir(r'f:\\') decompress('fang','tar_file1.tar.gz','tar_file2.tar.bz2','test1.zip') 注:本答案部分来自互联网,如有雷同,纯属借鉴


赞助商链接
相关文章:
python核心编程第二版第2章习题答案
python核心编程第二版第2章习题答案_教育学_高等教育_教育专区。python核心编程...答案: (a)计算 (b)输出 9 (c)不一样,不会有输出 (d)在交互解释器中...
python核心编程第二版第7章习题答案
python核心编程第二版第7章习题答案_教育学_高等教育_教育专区。python核心编程...(0,9)) B = set(xyz) print A print B for i in range(0,3): ...
python核心编程第二版第8章习题答案
python核心编程第二版第8章习题答案_教育学_高等教育_教育专区。python核心编程...(a)[0,1,2,3,4,5,6,7,8,9] (b)[3,6,9,12,15,18] (c)[-20...
python核心编程第二版第4章习题答案
python核心编程第二版第4章习题答案_理学_高等教育_教育专区。python核心编程第二版第4章习题答案 4-1.Python 对象。与所有 Python 对象有关的三个属性是什么?...
Python核心第二版习题答案
Python核心第二版习题答案_文学_高等教育_教育专区。python核心编程第二版 答案 (更新中) Pytho 核心编程第二版(第二,三,四,五章)答案 第二章 2-3 a=int(...
python核心编程第二版第3章习题答案
python核心编程第二版第3章习题答案_理学_高等教育_教育专区。python核心编程第...答案:略 3-9.移植。如果你在不同类型的计算机系统中分别安装有 Python,检查一...
python核心编程第二版课后题答案第八章
python核心编程第二版课后题答案第八章_工学_高等教育_教育专区。python核心编程...(num): '''8-9 fibonacci 数列,给定 num 返回第 num 个的值''' # ...
python核心编程第二版课后题答案第十五章
python核心编程第二版课后题答案第十五章_工学_高等教育_教育专区。python核心编程第二版课后题答案,转载,仅供参考 #15-1 识别下列字符串:“bat,”“bit,”“...
python核心编程第二版课后题答案第六章
python核心编程第二版课后题答案第六章_工学_高等教育_教育专区。python核心编程...{1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:...
python核心编程第二版习题解答及执行结果第二章-py3.4实现
python核心编程第二版习题解答及执行结果第二-py3.4实现_计算机软件及应用_IT/计算机_专业资料。python核心编程第二版习题解答及执行结果第二-py3.4实现 附...
更多相关文章: