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