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

52

我有一个非常简单的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

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


2
.gz”文件与“.tar.gz”文件不同。 - Nehal J Wani
好的,那么我应该怎么做才能在不解压缩的情况下读取tar.gz文件呢? - Geet
1
如果只是一个文件,为什么要使用 tar 压缩呢?为什么不直接使用 gzip 压缩呢?这样你就可以直接使用 pd.read_csv() 读取它了。 - Nehal J Wani
1
我没有压缩它。这是给定的,而且我无法解压原始文件,因为它超过了100 GB。 - Geet
@Geet:不,我的意思是如果您解压缩/解包它并尝试在实际的CSV文件上使用read_csv,而不是尝试让pandas进行解压缩。 - BrenBarn
显示剩余5条评论
2个回答

84
df = pd.read_csv('sample.tar.gz', compression='gzip', header=0, sep=' ', quotechar='"', error_bad_lines=False)
注意:error_bad_lines=False 将忽略有问题的行。

谢谢,马龙。这里第三行的“.dat”是什么意思? - Geet
@Geet,还有告诉我你的pandas版本。这应该适用于0.18.1。 - Marlon Abeykoon
我的pandas版本是0.18.1。更新后的代码给了我“CParserError:解析数据时出错。C错误:在第440行中期望1个字段,但看到了2个”错误。 - Geet
2
这对我来说在一个样本csv文件上起作用。你的链接让我下载了40GB。你没有一个样本可以让我测试吗? - Marlon Abeykoon
@BrenBarn:我有一个1-2 KB的文件,但是我怎么在这里提供它呢? - Geet
显示剩余9条评论

14
您可以使用 tarfile 模块 从 tar.gz 存档中读取特定文件(正如在 此已解决问题的评论 中所讨论的)。 如果存档中只有一个文件,则可以执行以下操作:
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扩展名(或其他类型的压缩)。 如果在zipped tar文件中有多个文件,则您可以执行像csv_path = list(n for n in tar.getnames() if n.endswith('.csv'))[-1]这样的行来获取归档文件夹中的最后一个csv文件。


1
“r:*”(或等效地“r”)不是默认值吗?我看不出明确指定它有什么好处。 - Asclepius
@Asclepius 明确胜于含蓄 - Python之禅 - tmthyjames
@tmthyjames 也许你更喜欢使用 C 编程,因为它的一切都是尽可能明确的。 - Asclepius
@Asclepius 我几乎不会用Python编程! :) - tmthyjames

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接