使用 Pandas (Python) 读取西班牙语的 SPSS 文件时出错

问题描述

早上好!

我正在尝试在 Python 中使用 SPSS 文件 (.sav)。

这是我的代码

import pandas as pd

df=pd.read_spss('C:/Users/bonif/Documents/CSALUD01.sav')

df.head()

我收到此错误

df=pd.read_spss('C:/Users/bonif/Documents/CSALUD01.sav')
  File "C:\Users\bonif\AppData\Local\Programs\Python\python39\lib\site-packages\pandas\io\spss.py",line 44,in read_spss
    df,_ = pyreadstat.read_sav(
  File "pyreadstat\pyreadstat.pyx",line 342,in pyreadstat.pyreadstat.read_sav
  File "pyreadstat\_readstat_parser.pyx",line 1034,in pyreadstat._readstat_parser.run_conversion
  File "pyreadstat\_readstat_parser.pyx",line 845,in pyreadstat._readstat_parser.run_readstat_parser
  File "pyreadstat\_readstat_parser.pyx",line 775,in pyreadstat._readstat_parser.check_exit_status
pyreadstat._readstat_parser.ReadstatError: Unable to convert string to the requested encoding (invalid byte sequence)

我发现错误可能是因为有些单词带有字母“ñ”,或者有些单词带有以下字符“á”。我该如何解决这个问题?

数据库在这个谷歌驱动器中:https://drive.google.com/drive/folders/1P8v5NWE-GdAEJRZdmrp5KiL-DODClmfU?usp=sharing

非常感谢

解决方法

Pandas 调用 pyreadstat 读取 SPSS 文件 src

直接使用它可能会更幸运,它可以选择设置编码

来自文档 https://github.com/Roche/pyreadstat#other-options

您可以手动设置原始文件的编码。编码必须是 iconv-compatible encoding。如果您正在处理带有非 ascii 字符的旧 xport 文件,这是绝对必要的。那些文件本身没有标记编码,因此必须手动设置编码。

import pyreadstat
df,meta = pyreadstat.read_sav(path,encoding=my_encoding)

也可能是您根本没有安装 iconv(它依赖于编码),但我对此表示怀疑(您会遇到其他一些错误)

,

正如 ti7 建议的那样,使用 pyreadstat,并且您需要指定编码,在这种情况下,latin1 将起作用:

>>> import pyreadstat
# This raises an error
>>> df,meta = pyreadstat.read_sav("CSALUD01.sav")
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "pyreadstat/pyreadstat.pyx",line 342,in pyreadstat.pyreadstat.read_sav
  File "pyreadstat/_readstat_parser.pyx",line 1034,in pyreadstat._readstat_parser.run_conversion
  File "pyreadstat/_readstat_parser.pyx",line 845,in pyreadstat._readstat_parser.run_readstat_parser
  File "pyreadstat/_readstat_parser.pyx",line 775,in pyreadstat._readstat_parser.check_exit_status
pyreadstat._readstat_parser.ReadstatError: Unable to convert string to the requested encoding (invalid byte sequence)

# This is fine
>>> df,meta = pyreadstat.read_sav("CSALUD01.sav",encoding="latin1")
>>>