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)
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('
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')