我想通过(Python)创建一个解压缩(.tar.gz)文件的脚本

时间:2015-06-17 09:45:41

标签: python tar unzip gz

我正在尝试创建一个脚本,用于从一个目录中的文件夹中解压缩所有.tar.gz文件。例如,我将调用一个文件(testing.tar.gz)。然后,如果我手动操作,我可以按下"在这里提取"然后.tar.gz文件将创建一个新文件,并调用testing.tar。最后,如果我重复按下"提取这里"的过程,.tar文件会将所有.pdf文件作为产品。

我想知道我怎么能这样做,而且我的代码在这里,看起来并不是不动产。

import os
import tarfile
import zipfile

def extract_file(path, to_directory='.'):
    if path.endswith('.zip'):
        opener, mode = zipfile.ZipFile, 'r'
    elif path.endswith('.tar.gz') or path.endswith('.tgz'):
        opener, mode = tarfile.open, 'r:gz'
    elif path.endswith('.tar.bz2') or path.endswith('.tbz'):
        opener, mode = tarfile.open, 'r:bz2'
    else: 
        raise ValueError, "Could not extract `%s` as no appropriate extractor is found" % path

    cwd = os.getcwd()
    os.chdir(to_directory)

    try:
        file = opener(path, mode)
        try: file.extractall()
        finally: file.close()
    finally:
        os.chdir(cwd)

6 个答案:

答案 0 :(得分:53)

为什么你想“按”两次以提取.tar.gz,当你可以轻松地做一次?这是一个简单的代码,可以一次性提取.tar和.tar.gz:

import tarfile
if (fname.endswith("tar.gz")):
    tar = tarfile.open(fname, "r:gz")
    tar.extractall()
    tar.close()
elif (fname.endswith("tar")):
    tar = tarfile.open(fname, "r:")
    tar.extractall()
    tar.close()

答案 1 :(得分:1)

如果您在 jupyter-notebooklinux 机器中使用 python,以下将执行:

!tar -xvzf /path/to/file.tar.gz -C /path/to/save_directory

! 使命令能够在终端中运行。

答案 2 :(得分:0)

当我运行你的程序时,它完全适用于tar.gz和.tgz文件,当我打开zip时它没有给我正确的项目,但.tbz是唯一一个引发错误的文件。我认为您使用了错误的方法解压缩.tbz,因为错误说我的文件类型不正确,但我没有。解决.zip问题的一种方法是使用os.command()并使用命令行解压缩(取决于你的操作系统)因为它返回了一个_MACOSX文件夹,里面没有任何内容,即使我正确输入了路径。我遇到的唯一其他错误是您使用了不正确的语法来引发错误。
这是你应该使用的:

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="keywords" content="">
  <meta name="description" content="">
  <title>PROFIT-CENTER.RU</title>
  <link rel="stylesheet" href="stylesheet.css">
</head>

<body>
  <div id="page-wrap">
    <header class="clearfix">
      <div id="logo">
        <img class="logo" src="logo.png" alt="logo">
      </div>
      <div id="menu1">
        <ul>
          <li class="first"><a href="#">Условия</a></li>
          <li class="second"><a href="#">Поддержка</a></li>
          <li class="third"><a href="#">Форум</a></li>
        </ul>
      </div>
      <div id="support">
        <img src="icq.png" alt="icq" class="icq">
        <span class="icqnumber">361855340</span>
        <div id="supporttitle">
          <span class="support-worktime">Служба поддержки 24/7</span>
        </div>
      </div>
    </header>
    <div class="my-flex-container">
      <div class="my-flex-block1">
        <p class="slogan1">Заработай на своих</p>
        <p class="slogan2">сайтах больше!</p>
      </div>






      <div class="my-flex-block2">
        <h3>Вход</h3>
        <form action="" method="post" accept-charset="utf-8">
          <input type="text" name="login" value="" class="login-field">
          <br>
          <input type="password" name="login" value="" class="login-field">
          <br>
          <input type="checkbox">
          <span class="remember">Запомнить меня</span>
          <input type="button" name="login" value="Войти" class="loginbutton">
          <div class="forgot">
            <p class="forgot">Я забыл пароль</p>

          </div>
        </form>
      </div>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="script.js"></script>
</body>

</html>

您使用了逗号而没有括号。希望这有帮助!

答案 3 :(得分:0)

这是一个更简单的选项:

amr

答案 4 :(得分:0)

如果您使用的是python 3,则应使用适用于大多数常见存档格式的shutil.unpack_archive

  

shutil.unpack_archive(filename [,extract_dir [,format]])

     

解压缩档案。 filename是存档的完整路径。      extract_dir是解压缩档案的目标目录的名称。如果未提供,则使用当前的工作目录。

例如:

def extract_all(archives, extract_path):
    for filename in archives:
        shutil.unpack_archive(filename, extract_path)

答案 5 :(得分:0)

使用上下文管理器:

import tarfile
<another code>
with tarfile.open(os.path.join(os.environ['BACKUP_DIR'],
                  f'Backup_{self.batch_id}.tar.gz'), "r:gz") as so:
    so.extractall(path=os.environ['BACKUP_DIR'])