我有一个超过40GB的tar.gz文件,存储在https://ghtstorage.blob.core.windows.net/downloads/mysql-2016-06-16.tar.gz。如何在不解压整个文件(可能超过100GB)的情况下查找压缩在其中的CSV文件中的行数?
我有一个超过40GB的tar.gz文件,存储在https://ghtstorage.blob.core.windows.net/downloads/mysql-2016-06-16.tar.gz。如何在不解压整个文件(可能超过100GB)的情况下查找压缩在其中的CSV文件中的行数?
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文件通常有标题,因此每个文件删除一行即可得到行数。不需要解压整个文件,该文件可能超过100GB
我想你的意思是不先将文件提取到磁盘中。以下是一种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')
def listmembers(infile):
with gz.GzipFile(infile) as zipf:
with tf.TarFile(fileobj=zipf) as tarf:
return list(m.name for m in tarf)
计算tar文件中所有文件的行数:
for member in listmembers(infile):
print member, linecount(infile, member)
在开始之前,了解tar文件的结构将会很有用。