2017-03-06 57 views
0

我有超过300个文件被命名如下:如何解压多个文件

dumpADS-2017-01-01_0029.log.gz

唯一的区别这些文件的日期。 这里一个例子,第一个文件是从1月8日,而第二个是从1月9日:

dumpADS-2017-01-08_0029.log.gz 
dumpADS-2017-01-09_0029.log.gz 

我所试图做的是解压缩这些文件,并把数据在阵列,这样我可以工作与数据。我的问题是如何解压所有这些文件,而不必重复相同的命令300次并手动更改日期。我做了什么来解压缩数据,并把数据放入数组如下:

import numpy as np 
t=np.genfromtxt('X:\ADS2017\dumpADS-2017-01-02_0029.log.gz',dtype = np.str,delimiter=",") 

但在运行程序和以前说过,如果我不喜欢这样,我将不得不写时,这是非常缓慢这300次使用不同的文件名。 是否有可能使用for循环或者有什么其他的可能性来完成这个任务?

+0

@SiHa我编辑了我的第一篇文章,并包括我的程序,我希望这可以让它更清晰 – Kenny

+0

更好:)尽管如此,仍然不完全清楚。这里有很多代码,你应该试着将你的问题压缩成一个[mcve],然后解释你的问题到底是什么。你只是想让你的代码运行得更快,还是其他的东西? – SiHa

+0

@SiHa我改变了这个问题,因为我在这里挣扎着两种不同的东西,并且问这两个问题使得它不那么明确 – Kenny

回答

0

这里要做的事情是使用os循环访问ADS2017目录中的文件名。如果您要将数据加载到内存中并执行分析,可能需要先将所有内容解压缩,然后从解压缩的文件中准备好numpy数组。

一个例子是

import os 
import gzip 
import numpy as np 

dirn = 'ADS2017' 
unzipped_dirn = 'ADS2017_unzipped' 

if not os.path.exists(unzipped_dirn): 
    os.mkdir(unzipped_dirn) 

# Unzip files. 
for fname in os.listdir(dirn): 
    full_fname = os.path.join(dirn, fname) 
    with gzip.open(full_fname, 'rb') as f: 
     content = f.read() 

    new_full_fname = os.path.join(unzipped_dirn, fname.replace('.gz', '')) 
    with open(new_full_fname, 'wb') as f: 
     f.write(content) 

# Load files. 
ts = [] 
for fname in os.listdir(unzipped_dirn): 
    full_fname = os.path.join(unzipped_dirn, fname) 
    ts.append(np.genfromtxt(full_fname,dtype = np.str,delimiter=",")) 
+0

这似乎是一个问题,因为文件是在拆包后小得多,那么他们应该是。此外,我收到以下消息为每一行:行#2638590(得到3列而不是1) – Kenny

+0

@Kenny这是因为gzip被打开为解压缩文件。我修复了代码。这是否会在提取后导致预期的文件大小? – heyiamt

0

有效的gzip文件级联也是一个有效的gzip文件。您可以简单地(以Unix/Linux为例)cat dumpADS-*.log.gz > all.log.gz并读取或解压缩一个gzip文件all.log.gz。 shell将按照排序顺序放置参数,这会按照日期顺序将它们放在连接文件中。