带有通配符的Python脚本中的Untar文件

时间:2016-08-22 15:30:27

标签: python unix rar

我正在尝试使用Python脚本从HDFS导入tar.gz文件,然后解压缩它。该文件如下: 20160822073413-EoRcGvXMDIB5SVenEyD4pOEADPVPhPsg.tar.gz ,它始终具有相同的结构。

在我的python脚本中,我想在本地复制它并解压缩文件。我使用以下命令执行此操作:

import subprocess
import os
import datetime
import time

today = time.strftime("%Y%m%d")

#Copy tar file from HDFS to local server
args = ["hadoop","fs","-copyToLocal", "/locationfile/" + today + "*"]

p=subprocess.Popen(args)

p.wait()

#Untar the CSV file 
args = ["tar","-xzvf",today + "*"]

p=subprocess.Popen(args)

p.wait()

导入工作完美,但我无法解压缩文件,我收到以下错误:

['tar', '-xzvf', '20160822*.tar']
tar (child): 20160822*.tar: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
put: `reportResults.csv': No such file or directory

任何人都可以帮助我吗?

非常感谢!

3 个答案:

答案 0 :(得分:3)

尝试使用shell选项:

p=subprocess.Popen(args, shell=True)

来自the docs

  

如果shell为True,则将通过执行指定的命令   贝壳。如果您主要使用Python,这可能很有用   增强的控制流程,它提供了大多数系统外壳,仍然需要   方便地访问其他shell功能,如shell管道,   文件名通配符,环境变量扩展和扩展〜   到用户的主目录。

请注意:

  

但请注意,Python本身提供了许多实现   类似shell的特性(特别是glob,fnmatch,os.walk(),   os.path.expandvars(),os.path.expanduser()和shutil。。

答案 1 :(得分:2)

除了@martriay的答案,你还有一个拼写错误 - 你写了“20160822 * .tar”,而你的文件模式是“20160822 * .tar.gz”

应用shell=True时,该命令应作为整个字符串传递(请参阅documentation),如下所示:

p=subprocess.Popen('tar -xzvf 20160822*.tar.gz', shell=True)

如果您不需要p,则可以使用subprocess.call

subprocess.call('tar -xzvf 20160822*.tar.gz', shell=True)

但是我建议您使用更多标准库,如下所示:

import glob
import tarfile

today = "20160822"  # compute your common prefix here
target_dir = "/tmp"  # choose where ever you want to extract the content

for targz_file in glob.glob('%s*.tar.gz' % today):
    with tarfile.open(targz_file, 'r:gz') as opened_targz_file:
        opened_targz_file.extractall(target_dir)

答案 2 :(得分:0)

我找到了一种方法来做我需要的,而不是使用os命令,我使用python tar命令,它的工作原理!

import tarfile
import glob

os.chdir("/folder_to_scan/")
for file in glob.glob("*.tar.gz"):
    print(file)

tar = tarfile.open(file)
tar.extractall()

希望得到这个帮助。

此致 马吉德