【问题标题】:How can I read tar.gz file using pandas read_csv with gzip compression option?如何使用带有 gzip 压缩选项的 pandas read_csv 读取 tar.gz 文件?
【发布时间】: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。

标签: python csv pandas gzip tar


【解决方案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)不是默认值吗?我看不出明确指定它有什么好处。
猜你喜欢
  • 2019-06-10
  • 2022-08-11
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多