SPSS – 使用 Python 批量处理文件

通过 Ruben Geert van den Berg 发布在 SPSS Python 基础 下。

一次性对多个 SPSS 数据文件运行语法非常容易。如果使用 SPSS with Python,甚至不需要手动输入文件名。Python 的 os 模块(代表 operating system,操作系统)可以帮我们完成这项工作。

您可以自行尝试,下载 spssfiles.zip 文件。将这些文件解压到 d:\spssfiles 目录下,如下所示,就可以开始了。

SPSS 数据和语法文件位于文件夹中

查找根目录中的所有文件和文件夹

以下语法在 rDir(我们的根目录)中创建一个文件和文件夹的 Python 列表。在目录路径前加上 r,如 r'D:\spssfiles',可以确保 反斜杠 不会产生任何奇怪的行为。

查找根目录中的所有文件和文件夹。

begin program.
import os
rDir = r'D:\spssfiles'
print os.listdir(rDir)
end program.

结果

文件夹中所有文件的 Python 列表

过滤出所有 .Sav 文件

正如我们所见,os.listdir() 创建了一个 rDir 中所有文件和文件夹的列表,但我们只想要 SPSS 数据文件(.sav 文件)。为了过滤掉它们,我们首先创建一个空列表 savs = []。接下来,如果文件名以 .sav 结尾,我们将把每个文件添加到这个列表中。

将所有 .sav (SPSS 数据) 文件添加到 Python 列表。

begin program.
import os
rDir = r'D:\spssfiles'
savs = []
for fil in os.listdir(rDir):
    if fil.endswith(".sav"):
        savs.append(fil)
print savs
end program.

使用 SPSS 文件的完整路径

为了对数据文件进行任何操作,我们可能需要打开它们。为此,SPSS 需要知道它们位于哪个文件夹中。我们可以简单地使用 CD 命令在 SPSS 中设置一个默认目录,如 CD "d:\spssfiles"。然而,让 Python 使用 os.path.join() 创建文件的完整路径是更可靠的方法。

创建所有 .sav 文件的完整路径。

begin program.
import os
rDir = r'D:\spssfiles'
savs = []
for fil in os.listdir(rDir):
    if fil.endswith(".sav"):
        savs.append(os.path.join(rDir,fil))
for sav in savs:
    print sav
end program.

结果

SPSS 输出中的 Sav 文件的完整路径

让 SPSS 打开每个数据文件

通常,我们使用类似 GET FILE "d:\spssfiles\mydata.sav". 的命令在 SPSS 中打开一个数据文件。如果我们将文件名替换为 Python 列表中的每个路径,我们将逐个打开每个数据文件。然后,我们可以添加一些想要在每个文件上运行的语法。最后,我们可以使用 SAVE OUTFILE "..." 保存我们的编辑,这样就可以批量处理多个文件。然而,在本例中,我们将简单地使用 spssaux.GetVariableNamesList() 查找每个文件包含哪些变量。

打开所有 SPSS 数据文件并打印它们包含的变量。

begin program.
import os,spss,spssaux
rDir = r'D:\spssfiles'
savs = []
for fil in os.listdir(rDir):
    if fil.endswith(".sav"):
        savs.append(os.path.join(rDir,fil))
for sav in savs:
    spss.Submit("GET FILE '%s'."%sav)
    print sav,spssaux.GetVariableNamesList()
end program.

结果

SPSS 文件名和变量名与 Python

检查哪些文件包含“Salary”变量

现在假设我们想知道哪些文件包含某个变量“salary”。我们只需检查它是否出现在我们的变量名列表中,如果存在,则打印回数据文件的名称。

报告所有包含变量“salary”(区分大小写)的 .sav 文件。

begin program.
import os,spss,spssaux
rDir = r'D:\spssfiles'
findVar = 'salary'
savs = []
for fil in os.listdir(rDir):
    if fil.endswith(".sav"):
        savs.append(os.path.join(rDir,fil))
for sav in savs:
    spss.Submit("get file '%s'."%sav)
    if findVar in spssaux.GetVariableNamesList():
        print sav
end program.

结果

SPSS 使用 Python 跨文件查找变量

规避 Python 的大小写敏感性

还有一点我想介绍:由于我们搜索“salary”,Python 不会检测到“Salary”或“SALARY”,因为它完全区分大小写。如果您不喜欢这样,一个简单的解决方案是将所有文件的所有变量名转换为 lower() 小写。

更改 Python 列表中的所有项目 的基本方法是 [i... for i in list],其中 i...i 的修改版本,在我们的例子中是 i.lower()。 这种技术被称为 Python 列表推导式(list comprehension),下面的语法使用它将所有变量名转换为小写(第 13 行)。

报告所有包含变量“salary”(不区分大小写)的 .sav 文件。

begin program.
import os,spss,spssaux
rDir = r'D:\spssfiles'
findVar = 'salary'
savs = []
for fil in os.listdir(rDir):
    if fil.endswith(".sav"):
        savs.append(os.path.join(rDir,fil))
for sav in savs:
    spss.Submit("get file '%s'."%sav)
    if findVar.lower() in [varNam.lower() for varNam in spssaux.GetVariableNamesList()]:
        print sav
end program.

注意:因为我通常避免在 SPSS 变量名中使用任何大写,所以结果与我们区分大小写的搜索相同。