Python 40GB tar.gz文件中未解压缩的行数?

Python 40GB tar.gz文件中未解压缩的行数?,python,csv,gzip,tar,Python,Csv,Gzip,Tar,我有超过40 gb的tar.gz文件 如何在不解压缩整个文件(可能为100+GBs)的情况下找到压缩在tar.gz文件中的CSV文件中的行数 如果tar.gz中只有一个csv文件,您可以将其作为bash one liner来执行: tar-zxOf mysql-2016-06-16.tar.gz|wc-l 它使用tar将归档中的所有文件提取到标准输出(-O,大写字母O,而不是零),并使用wc计算行数 如果有更多文件,并且只需要一个文件,则可以按如下方式计算该文件中的行数: tar-zxOf my

我有超过40 gb的tar.gz文件
如何在不解压缩整个文件(可能为100+GBs)的情况下找到压缩在tar.gz文件中的CSV文件中的行数

如果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文件通常有一个标题,所以删除每个文件的一行,您就有了行数

不解压缩整个文件(可能为100+GBs)

我想你的意思是不先将文件解压缩到磁盘。下面是实现这一点的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)  
要计算文件中所有文件的行数,请执行以下操作:

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

在您开始之前,它将非常有用。

您是否正在寻找一种专门使用Python的方法?您不能,但您可能希望制作人将该信息添加到名称中,这样您就不必自己计算。要计算行数,您需要在某个时间解压缩文件的每个部分。不过,您可能可以分块处理它,而不是一次解压缩整个文件。选择一个适合内存的块大小,文件的大小就不那么重要了。这就是你想要的(如何成批处理
.tar.gz
文件)?是的,我需要在Python@Juhana中执行。@Blckknght:如何成批解压缩.tar.gz文件,读取数据,并以迭代方式将其写入CSV?这是执行动态解压缩还是提取到临时文件?这是在内存中进行动态解压缩。感谢@miraculixx提供的代码。我想,我就快到了,但上面说的是“filename'test.csv'notfound”。我是Python新手:(.下一步该怎么办?我可以告诉你,但我想你会从我完整的示例代码中受益匪浅。你的思路是对的。提示:我并没有下载你的文件,我自己制作了
tar.gz
,并包含了一个
test.csv
。好的,我会尽力理解的。谢谢你分享详细信息code@miraclixx。事实上,我在两周前才学会Python,我正在采取一些小步骤向你们学习。非常感谢你们的耐心!