如何使用带有 gzip 压缩选项的 pandas read_csv 读取 tar.gz 文件?

Posted

技术标签:

【中文标题】如何使用带有 gzip 压缩选项的 pandas read_csv 读取 tar.gz 文件?【英文标题】:How can I read tar.gz file using pandas read_csv with gzip compression option? 【发布时间】:2017-01-08 21:20:46 【问题描述】:

我有一个非常简单的 csv,包含以下数据,压缩在 tar.gz 文件中。我需要使用 pandas.read_csv 在数据框中读取它。

   A  B
0  1  4
1  2  5
2  3  6

import pandas as pd
pd.read_csv("sample.tar.gz",compression='gzip')

但是,我收到错误:

CParserError: Error tokenizing data. C error: Expected 1 fields in line 440, saw 2

以下是一组 read_csv 命令以及我使用它们时遇到的不同错误:

pd.read_csv("sample.tar.gz",compression='gzip',  engine='python')
Error: line contains NULL byte

pd.read_csv("sample.tar.gz",compression='gzip', header=0)
CParserError: Error tokenizing data. C error: Expected 1 fields in line 440, saw 2

pd.read_csv("sample.tar.gz",compression='gzip', header=0, sep=" ")
CParserError: Error tokenizing data. C error: Expected 2 fields in line 94, saw 14    

pd.read_csv("sample.tar.gz",compression='gzip', header=0, sep=" ", engine='python')
Error: line contains NULL byte

这里出了什么问题?我该如何解决这个问题?

【问题讨论】:

'.gz' 文件与'.tar.gz'不同 好的,那我应该怎么做才能在不解压的情况下读取 tar.gz 文件呢? 如果是单个文件,你为什么tar-ing呢?为什么不只是gzip呢?这样你就可以直接使用 pd.read_csv() 了。 我不是在处理它。它已提供,我无法解压缩原始文件,因为它超过 100 GB。 实际文件在这里...ghtstorage.blob.core.windows.net/downloads/… 【参考方案1】:
df = pd.read_csv('sample.tar.gz', compression='gzip', header=0, sep=' ', quotechar='"', error_bad_lines=False)

注意:error_bad_lines=False 将忽略违规行。

【讨论】:

谢谢,马龙。第三行的“.dat”是什么? 当我尝试这样做时,它显示 KeyError: "filename 'sample.dat' not found" @Geet 并告诉我你的熊猫版本。这应该适用于 0.18.1 我的熊猫版本是 0.18.1。更新后的代码给了我“CParserError: Error tokenizing data. C error: Expected 1 fields in line 440, saw 2”错误 这对我来说适用于示例 csv 文件。你的链接让我下载 40GB。你没有样品给我测试吗?【参考方案2】:

您可以使用tarfile module 从 tar.gz 存档中读取特定文件(如this resolved issue 中所述)。 如果存档中只有一个文件,那么您可以这样做:

import tarfile
import pandas as pd
with tarfile.open("sample.tar.gz", "r:*") as tar:
    csv_path = tar.getnames()[0]
    df = pd.read_csv(tar.extractfile(csv_path), header=0, sep=" ")

读取模式r:* 会适当地处理 gz 扩展(或其他类型的压缩)。如果压缩后的 tar 文件中有多个文件,那么您可以执行csv_path = list(n for n in tar.getnames() if n.endswith('.csv'))[-1] 行之类的操作来获取存档文件夹中的最后一个 csv 文件。

【讨论】:

r:*(或等效的r)不是默认值吗?我看不出明确指定它有什么好处。

以上是关于如何使用带有 gzip 压缩选项的 pandas read_csv 读取 tar.gz 文件?的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用read_csv读取数据使用skiprows参数跳过指定的数据行但保留表头pandas使用to_csv函数将dataframe保存为gzip压缩文件

使用 --rsyncable 选项使 zstd 压缩文件像 gzip 一样“可同步”

Python zlib 解压缩 gzipped 数据

如何在 Rails for Android 中使用 gzip 压缩 JSON?

我可以使用pandas附加到压缩流吗?

压缩命令 gzip bzip2 xz zip