有没有Python模块可以打开SPSS文件?

43 投票
9 回答
59349 浏览
提问于 2025-04-17 14:26

有没有一个Python模块可以打开IBM SPSS的文件(也就是.sav文件)?如果有一个最新的模块,而且不需要额外的dll文件或库,那就太好了。

9 个回答

11

根据你想做的事情,如果你想用R相关的命令处理数据,可以使用rpy2,或者你也可以选择切换到Python。在一个相关的讨论中,@Spacedman提供的解决方案可能很容易调整来满足你的需求。

另外,Pandas也包含了一个方便的封装来使用rpy2。下面是一个使用Peat和Barton的weights.sav数据集的例子:

>>> import pandas.rpy.common as com
>>> filename = "weights.sav"
>>> w = com.robj.r('foreign::read.spss("%s", to.data.frame=TRUE)' % filename)
>>> w = com.convert_robj(w)
>>> w.head()
     ID  WEIGHT  LENGTH  HEADC  GENDER  EDUCATIO              PARITY
1  L001    3.95    55.5   37.5  Female  tertiary  3 or more siblings
2  L003    4.63    57.0   38.5  Female  tertiary           Singleton
3  L004    4.75    56.0   38.5    Male    year12          2 siblings
4  L005    3.92    56.0   39.0    Male  tertiary         One sibling
5  L006    4.56    55.0   39.5    Male    year10          2 siblings
14

当你的 pandas 版本大于等于 0.25.0 时,你现在可以直接使用 pd.read_spss() 这个函数了:

# you need pandas >= 0.25.0 for this    
import pandas as pd
df = pd.read_spss('your_spss_file.sav')

这个功能需要一个叫 pyreadstat 的库,所以你可能需要先安装它:

pip install pyreadstat

关于 pd.read_spss() 的一些参数的额外信息:

参数
----------
path : 字符串或路径
文件的路径

usecols : 类似列表的,选填
返回某些列的子集。如果不填,返回所有列。

convert_categoricals : 布尔值,默认是 True
将分类列转换为 pd.Categorical 类型。

返回值
-------
数据框(DataFrame)

41

我发布了一个叫“pyreadstat”的Python包,它可以读取SPSS(sav、zsav和por格式)、Stata和SAS文件。这个包是基于一个叫ReadStat的C语言库,所以它运行得非常快。ReadStat是R语言库Haven背后的库,Haven在数据处理方面非常流行且稳定。

这个包是自包含的。也就是说,你不需要使用R(不需要安装额外的应用程序),也不依赖于IBM的dll文件或其他外部库。

比如,如果你想读取一个SPSS的sav文件,你可以这样做:

import pyreadstat

df, meta = pyreadstat.read_sav("/path/to/sav/file.sav")

这里的df是一个pandas数据框,Meta包含一些元数据,比如变量标签或数值标签。read_sav可以读取sav和zsav(压缩格式)文件。还有一个函数read_por可以读取旧的por(便携式)文件。

你可以在这里找到它:https://github.com/Roche/pyreadstat

撰写回答