没有解压的 40GB tar.gz 文件中的行数?
Posted
技术标签:
【中文标题】没有解压的 40GB tar.gz 文件中的行数?【英文标题】:Number of rows in 40GB tar.gz file without uncompressing it? 【发布时间】:2016-08-28 08:43:35 【问题描述】:我在https://ghtstorage.blob.core.windows.net/downloads/mysql-2016-06-16.tar.gz 有超过 40 GB 的 tar.gz 文件 如何在不解压缩可能超过 100 GB 的整个文件的情况下找到压缩在此 tar.gz 文件中的 CSV 文件中的行数?
【问题讨论】:
您是否正在寻找专门在 Python 中执行此操作的方法? 您不能,但您可能希望制作人将那条信息添加到名称中,这样您就不必自己弄清楚了。 要计算行数,您需要在某个时候解压缩文件的每个部分。不过,您也许可以分块处理它,而不是一次解压缩整个文件。选择适合内存的块大小,文件大小不是问题。这就是您要的(如何分块处理.tar.gz
文件)?
是的,我需要在 Python @Juhana 中完成。
@Blckknght:如何解压缩 .tar.gz 文件,读取数据,然后以迭代方式将其写入 CSV?
【参考方案1】:
如果该 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 文件通常有一个标题,因此每个文件删除一行即可获得行数。
【讨论】:
【参考方案2】:无需解压缩可能超过 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 会很有用。
【讨论】:
这是执行即时解压缩还是提取到临时文件中? 这是内存中的动态解压。 感谢@miraculixx 提供代码。我想,我快到了,但它说“找不到文件名'test.csv'”。我是 Python 新手 :(。接下来我该怎么做? 我可以告诉你,但我认为你会从实际思考我非常完整的示例代码中受益更多。你在正确的轨道上。 提示:我实际上并没有下载你的文件,我自己创建了tar.gz
并包含了一个test.csv
。
好的,我会尽量理解。感谢分享详细代码@miraculixx。实际上,我在 2 周前学习了 Python,并且正在向你们学习。非常感谢您的耐心等待!以上是关于没有解压的 40GB tar.gz 文件中的行数?的主要内容,如果未能解决你的问题,请参考以下文章