我有一个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=True
与SavReader
一起使用应该可以达到我的目标。因此,我执行以下操作:
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
如何解决这个问题?
答案 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:
块。