我正在使用以下代码将.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>'
答案 0 :(得分: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('/')])
答案 1 :(得分:0)
如果不必将它们全部解压缩到同一目录中,则可以添加os.chdir
以将工作目录更改为tar所在的位置。在上面的脚本中dirname
。
否则,您可以将每个tar提取到tmp目录,一旦提取完成,重命名dir以匹配您提取的文件的名称。
答案 2 :(得分: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('/')])