问题描述
早上好!
我正在尝试在 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")
>>>