37

是否有 Python 模块可以打开 IBM SPSS(即 .sav)文件?如果有一些最新的东西不需要任何额外的 dll 文件/库,那就太好了。

4

9 回答 9

34

我发布了一个 python 包“pyreadstat”,它可以读取 SPSS(sav、zsav 和 por)、Stata 和 SAS 文件。它是 C 库 ReadStat 的包装器,因此速度非常快。Readstat 是 R 库 Haven 后面使用的库,使用广泛,非常健壮。

包是自动包含的。它不需要使用 R(不需要安装额外的应用程序)并且它不依赖于 IBM dll 或其他外部库。

例如,为了读取 SPSS sav 文件,您可以:

import pyreadstat

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

df 是一个熊猫数据框。Meta 包含元数据,例如变量标签或值标签。read_sav 读取 sav 和 zsav(压缩)文件。对于旧的 por(便携式)文件,还有一个函数 read_por。

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

于 2018-08-22T10:39:06.330 回答
11

根据您想要做什么——使用来自rpy2的 R 相关命令处理数据,或切换到 Python—— @Spacedman在相关线程上提供的解决方案可能很容易适应您的需求。

否则,Pandas包含一个方便的rpy2. 以下是使用 Peat 和 Bartonweights.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
于 2014-01-01T20:54:32.310 回答
9

作为人们后来发现的注释(像我一样):pandas.rpy已在最新版本的熊猫(> 0.16)中被弃用,如此处所述。该页面包含有关更新代码以使用该rpy2界面的信息。

于 2015-06-26T12:19:54.947 回答
7

当您拥有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 : string 或 Path
文件路径

usecols:类似列表,可选
返回列的子集。如果没有,则返回所有列。

convert_categoricals : bool,默认为 True
将分类列转换为 pd.Categorical。

返回
--------
数据帧

于 2019-11-07T18:50:56.860 回答
3

但是使用 IBM 库的好处是他们可以正确地获得这种相当复杂的二进制文件格式。它们是免费的,减轻您为这种格式编写代码的负担,并且许可证允许您重新分发它们。你还能问什么?

于 2013-02-03T04:52:46.440 回答
3

这是您可能感兴趣的软件包

于 2016-09-05T08:56:46.823 回答
2

我和@Pyderman 有同样的问题,关于如何为熊猫更新这个(> 0.16)。这就是我想出的:

from rpy2.robjects import pandas2ri, r
filename = 'weights.sav'
w = r('foreign::read.spss("%s", to.data.frame=TRUE)' % filename)
df = pandas2ri.ri2py(w)
df.head()
于 2016-11-02T17:17:01.590 回答
1

也许您会发现这很有用:http ://code.activestate.com/recipes/577811-python-reader-writer-for-spss-sav-files-linux-mac-/

于 2013-02-01T13:14:12.363 回答
0

您可以使用R 的 python 接口,然后使用read.spssin导入数据library(foreign)

于 2013-04-15T10:40:42.687 回答