当前位置:文档之家› python核心编程第二版第9章习题答案

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

python核心编程第二版第9章习题答案
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 = https://www.doczj.com/doc/65942340.html,pile(

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%s\t%s\t%s
'

f.write('bookmark')

content = fmt % (i+1,name,r'http:\\' + url,url,mark,folder)

f.write(content)

f.write('')

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 https://www.doczj.com/doc/65942340.html,list():

t = time.ctime(time.mktime(tuple(list(i.date_time) + [0,0,0])))

try:

compress_percent = float(https://www.doczj.com/doc/65942340.html,press_size)/i.file_size * 100

print '%s\t%d\t%d\t%.2f%%\t%s\t' % (i.filename, https://www.doczj.com/doc/65942340.html,press_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')

相关主题
文本预览
相关文档 最新文档