40GB tar.gz文件中没有解压缩的行数?

时间:2016-08-28 08:43:36

标签: python csv gzip tar

我在https://ghtstorage.blob.core.windows.net/downloads/mysql-2016-06-16.tar.gz有超过40 gb的tar.gz文件 如何在不解压缩可能超过100 GB的整个文件的情况下找到在此tar.gz文件中压缩的CSV文件中的行数?

2 个答案:

答案 0 :(得分:3)

如果tar.gz中只有一个csv文件,你可以将其作为bash one-liner执行:

tar -zxOf mysql-2016-06-16.tar.gz | wc -l

它使用tar将存档中的所有文件提取到标准输出(-O,大写o,而不是零),并使用wc来计算行数。

如果有更多文件,只想要那个文件,你可以像这样计算该文件中的行:

tar -zxOf mysql-2016-06-16.tar.gz mysql-2016-06-16/commit_comments.csv| wc -l

以下是如何列出档案中的所有文件:

tar -zlf mysql-2016-06-16.tar.gz

CSV文件通常有一个标题,因此每个文件删除一行并且您有行数。

答案 1 :(得分:1)

  

不解压缩可能超过100 GB的整个文件

我想你的意思是先将文件解压缩到磁盘上。这是实现这一目标的Python方法:

import tarfile as tf
import gzip as gz
from StringIO import StringIO
infile = '/path/to/mysql-2016-06-16.tar.gz'
def linecount(infile, member):
    lc = 0
    with gz.GzipFile(infile) as zipf:
        with tf.TarFile(fileobj=zipf) as tarf:
            dataf = tarf.extractfile(member)
            while dataf.readline():
               lc += 1 
            dataf.close()       
    return lc
print linecount(infile, 'test.csv')
  

它说“文件名'test.csv'找不到”。

要知道tar文件包含哪些成员:

def listmembers(infile):
    with gz.GzipFile(infile) as zipf:
        with tf.TarFile(fileobj=zipf) as tarf:
            return list(m.name for m in tarf)  

计算tarfile中所有文件的行:

for member in listmembers(infile):
    print member, linecount(infile, member)

在开始之前,它对know how tar files are structured很有用。