如何无需完全解压即可提取.gz文件的部分内容
如何提取大体积csv.gz压缩包的前N行数据而不解压整个文件
.gz格式是流式压缩格式,完全不需要解压整个文件就可以提取前面部分的内容,以下是不同场景下的实现方案:
方案1:Linux/macOS 命令行(最便捷)
直接使用系统原生的gzip和head工具,全程流式处理,拿到指定行数后自动终止,仅会读取压缩包前部分内容,不会处理后续100多G的冗余数据:
- 提取前100万行保存为sample.csv的命令:
gzip -cd 你的文件.csv.gz | head -n 1000000 > sample.csv
参数说明:
gzip -c:将解压结果输出到标准输出流,不会生成完整的原始csv文件gzip -d:指定执行解压操作head -n 1000000:仅保留输入流的前100万行,读取到指定行数后立刻终止上游的gzip解压进程
如果要按字节提取(比如取压缩包前250M内容),可以用以下命令,注意该方案可能存在最后一行被截断的问题,优先推荐按行数提取:head -c 250M 你的文件.csv.gz | gzip -cd > sample.csv
方案2:Windows 环境实现
方式A:使用Git Bash/WSL
安装Git Bash或者开启WSL(Windows Linux子系统)后,直接运行上述Linux命令即可,体验和Linux完全一致。
方式B:PowerShell原生实现
不想安装额外工具的话,可以使用PowerShell的内置压缩库实现流式读取:
$limit = 1000000 $reader = New-Object System.IO.StreamReader(New-Object System.IO.Compression.GzipStream([System.IO.File]::OpenRead("你的文件.csv.gz"), [System.IO.Compression.CompressionMode]::Decompress)) $writer = New-Object System.IO.StreamWriter("sample.csv") $count = 0 while($count -lt $limit -and ($line = $reader.ReadLine()) -ne $null) { $writer.WriteLine($line) $count++ } $reader.Close() $writer.Close()
方案3:Python 跨平台实现
如果需要嵌入脚本或者自定义处理逻辑,可以用Python的gzip库流式读取,内存占用极低:
import gzip LINE_COUNT = 1000000 INPUT_PATH = "你的文件.csv.gz" OUTPUT_PATH = "sample.csv" with gzip.open(INPUT_PATH, "rt", encoding="utf-8") as f_in, open(OUTPUT_PATH, "w", encoding="utf-8") as f_out: for idx, line in enumerate(f_in): if idx >= LINE_COUNT: break f_out.write(line)
内容的提问来源于stack exchange,提问作者Michael Barrowman
相关产品推荐
相关产品推荐

