我正在尝试使用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
任何人都可以帮助我吗?
非常感谢!
答案 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()
希望得到这个帮助。
此致 马吉德