我想提取单个目录下所有.tgz和.tar文件
我正在使用以下代码来解压.tgz和.tar文件,解压后的文件会放在这些压缩文件所在的同一个文件夹里。对于单个文件,这个方法很好用。但是,当我选择同一个文件夹里的另一个文件进行解压时,当前的文件夹会被覆盖(所有文件都会解压到一个叫做storage的根文件夹里)。我想这就是文件被覆盖的原因。所以,我每次只能在这个文件夹里解压一个文件。我试着想一些聪明的方法,把文件解压到同一个文件夹里,也许在解压后给解压出来的文件起个独特的名字。不过,我还是个新手Python程序员,目前没有足够的技术知识和工具来完成这个任务。任何帮助都很感激。现在的情况是,每次我想解压一个文件时,都得选择一个不同的输出文件夹。
import os, sys, tarfile
def extract(tar_url, extract_path='.'):
print tar_url
tar = tarfile.open(tar_url, 'r')
for item in tar:
tar.extract(item, extract_path)
if item.name.find(".tgz") != -1 or item.name.find(".tar") != -1:
extract(item.name, "./" + item.name[:item.name.rfind('/')])
userpath = "Extracted"
directory = os.path.join("c:\\", userpath)
try:
for root, dirname, files in os.walk(directory):
for file1 in files:
if file1.endswith(".tgz") or file1.endswith(".tar"):
extract(os.path.join(root, file1))
print 'Done!'
except:
name = os.path.basename(sys.argv[0])
print name[:name.rfind('.')], '<filename>'
3 个回答
0
我现在无法测试这个,不过你能不能先检查一下有没有一个文件夹,名字和这个项目的名字一样,如果有的话就继续执行接下来的操作(大概就是这个意思)
def extract(tar_url, extract_path='.'):
print tar_url
tar = tarfile.open(tar_url, 'r')
for item in tar:
if(os.path.isdir(os.path.join(extract_path,item.name))):
continue;
tar.extract(item, extract_path)
if item.name.find(".tgz") != -1 or item.name.find(".tar") != -1:
extract(item.name, "./" + item.name[:item.name.rfind('/')])
0
如果不需要把所有文件都提取到同一个文件夹里,你可以使用 os.chdir
来改变你的工作目录,换到存放 tar 文件的地方,也就是你上面脚本中的 dirname
。
否则,你可以把每个 tar 文件提取到一个临时文件夹里,等提取完成后,再把这个临时文件夹重命名为你提取的文件的名字。
1
为什么不在提取(extract)方法中维护一个全局计数器,每次提取文件时把它加到'extract_path'里呢?在提取完成后(在extract()方法的最后),再把计数器加一。
import os, sys, tarfile
global counter
counter=1
def extract(tar_url, extract_path='.'):
global counter
print tar_url
tar = tarfile.open(tar_url, 'r')
for item in tar:
tar.extract(item, extract_path+"_%d"%counter)
counter+=1
if item.name.find(".tgz") != -1 or item.name.find(".tar") != -1:
extract(item.name, "./" + item.name[:item.name.rfind('/')])