将带有特殊字符的超大SPSS文件读入熊猫

时间:2018-10-19 10:17:52

标签: python pandas spss

我有一个SPSS(.sav)文件,具有超过90,000列和大约1800行。以前,我使用下面的代码(摘自this answer),效果很好。

raw_data = spss.SavReader('largefile.sav', returnHeader = True)
raw_data_list = list(raw_data)
data = pd.DataFrame(raw_data_list)
data = data.rename(columns=data.loc[0]).iloc[1:]

但是,现在某些列包含特殊字符(包括中文字符和带重音符号的字符)。使用documentation,看来将ioUtf8=TrueSavReader一起使用应该可以达到我的目标。因此,我执行以下操作:

raw_data = spss.SavReader('largefile.sav', returnHeader = True, ioUtf8=True)
raw_data_list = list(raw_data)
data = pd.DataFrame(raw_data_list)
data = data.rename(columns=data.loc[0]).iloc[1:]

第1行运行正常,但第2行返回以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 in position 6: invalid continuation byte

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的数据集中似乎有一些无法使用UTF-8解码的字符。即以latin-1编码的“á”。

c = 'à'

print c.decode('utf-8')

>>> UnicodeDecodeError: 'utf8' codec can't decode byte 0xe0 in position 0: unexpected end of data

print c.decode('latin-1')

>>> à

您可以尝试以Unicode格式保存数据集,以防万一它不是Unicode(为防万一,请在执行此操作之前进行备份)。请尝试以下操作:在不打开数据的情况下打开SPSS,键入

set unicode on. 

打开数据集并保存。现在它应该是unicode格式。现在尝试运行您的代码以导入数据。

***更新

您可以尝试逐行读取文件并处理出现的错误:

rawdata = []
with SavReader('largefile.sav', ioUtf8=True) as reader:
    for record in reader:
        try:
            rawdata.append(record)
        except UnicodeDecodeError:
            r = record.decode('latin-1')
            rawdata.append(r.encode('utf-8'))                
 data = pd.DataFrame(raw_data_list)
 data = data.rename(columns=data.loc[0]).iloc[1:]

因为您也有汉字,所以如果将其添加到原始数据列表中也会引起错误,则可能还必须添加另一个try: except:块。