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



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

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

df = pd.read_csv('sample.tar.gz', compression='gzip', header=0, sep=' ', quotechar='"', error_bad_lines=False)

注意:error_bad_lines=False将忽略有问题的行。

您可以使用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扩展(或其他类型的压缩(。如果压缩的tar文件中有多个文件,那么您可以执行类似csv_path = list(n for n in tar.getnames() if n.endswith('.csv'))[-1]行的操作来获取存档文件夹中的最后一个csv文件。

最新更新