我正在尝试创建一个脚本,用于从一个目录中的文件夹中解压缩所有.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)
答案 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-notebook
和 linux
机器中使用 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'])