代码之家  ›  专栏  ›  技术社区  ›  OD1995

将带有特殊字符的超大spss文件读入pandas

  •  0
  • OD1995  · 技术社区  · 7 年前

    我有一个SPSS(.sav)文件,超过90000列,大约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
    

    我怎样才能避开这个问题?

    1 回复  |  直到 7 年前
        1
  •  0
  •   ragamuffin    7 年前

    数据集中似乎有编码的字符无法用UTF-8解码即用拉丁语-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: 如果将它们添加到rawdata列表中也会引发错误,则阻止。