Python 文本替换教程与示例

作者:Ruben Geert van den Berg,归档于 SPSS Python 基础

  • 使用花括号进行单次文本替换
  • 使用花括号进行多次文本替换
  • 使用 F-strings 进行文本替换
  • 使用百分号进行多次文本替换
  • 使用 locals() 进行多次文本替换

概述

Python 中一个非常实用的技巧是文本替换:我们将小的文本片段(例如变量名)插入到较大的文本块(例如 SPSS 语法 命令)中。

在本教程中,我们将简单地构建并打印 SPSS 语法。希望 运行 Python 生成的语法的读者可以使用 health-costs.sav 数据文件,部分数据如下所示。

SPSS Health Costs Variable View

使用字符串连接进行单次文本替换

在深入研究文本替换之前,我想指出的是,您可以使用简单的字符串连接来执行替换。我们的第一个示例展示了如何实现。

***使用字符串连接进行单次文本替换。**
begin program python3.
xVars = ['alco','cigs','exer']
for xVar in xVars:
    print("GRAPH/SCATTER " + xVar + " WITH COSTS.")
end program.

请注意,我们将一些 SPSS 变量名指定为 Python 列表,其中包含带引号的字符串。一个更好的选择是扩展 SPSS 的 TO 关键字。我们将在 使用 Python 循环处理 SPSS 命令 中展示如何实现这一点。

结果

Python Generated SPSS Syntax In Output Window

好的,我们的字符串连接生效了。但是,它相当繁琐,尤其是对于多次文本替换。所以现在让我们尝试一些更优雅的方法。

使用花括号进行单次文本替换

对于非常基本的文本替换,只需在 Python 字符串中输入一对 花括号 {}。关闭字符串后,添加 .format() 并在括号中指定文本替换的内容。

***使用花括号进行单次文本替换。**
begin program python3.
xVars = ['alco','cigs','exer']
for xVar in xVars:
    print("GRAPH/SCATTER {} WITH COSTS.".format(xVar))
end program.

请注意,此代码比我们的第一个示例更简单易读。但是,它会生成完全相同的 SPSS 语法。下图说明了它的基本结构。

Python Text Replacement Curly Brackets

使用花括号进行多次文本替换

现在,让我们为我们的 SPSS 散点图语法添加更多灵活性:我们还将允许使用多个 y 变量和一个(子)标题。

由于所需的 SPSS 语法变得更长,因此明智的做法(但并非绝对必要)是使用多行来表示它。下面的示例通过将基本的 GRAPH 命令括在三引号中来实现这一点。

***使用花括号进行多次文本替换。**
begin program python3.
xVars = ['alco','cigs','exer']
yVar = 'costs'
subTitle = 'All Respondents | N = 525'
for xVar in xVars:
    print( '''
GRAPH/SCATTER {} WITH {}
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '{}'.'''.format(xVar,yVar,subTitle) )
end program.

请注意,花括号现在出现了 3 次。默认情况下,第一 对花括号被 format 后面指定的 第一 个元素替换,依此类推。

结果

Python Text Replacements Long Syntax In SPSS Output Window

除了简单地使用空花括号之外,我们可以更具体地说明要替换的内容:在下面的示例中,我们将向花括号添加索引,这些索引指向 format 指定的元组中的元素。这样,我们可以选择将这些替换插入到字符串对象中的顺序。

***使用索引进行多次文本替换。**
begin program python3.
xVars = ['alco','cigs','exer']
yVar = 'costs'
subTitle = 'All Respondents | N = 525'
for xVar in xVars:
    print( '''
GRAPH/SCATTER {2} WITH {1}
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '{0}'.'''.format(subTitle,yVar,xVar) )
end program.

也许比索引更好的是,我们还可以为占位符选择名称。这些名称可以与已经定义的 Python 对象相对应,也可以不对应。

***使用名称进行多次文本替换。**
begin program python3.
xVars = ['alco','cigs','exer']
yVar = 'costs'
subTitle = 'All Respondents | N = 525'
for xVar in xVars:
    print( '''
GRAPH/SCATTER {x} WITH {y}
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '{subTitle}'.'''.format(subTitle = subTitle,y = yVar,x = xVar) )
end program.

关于此语法,请注意:

  • 占位符 {x}xVar 替换;
  • 占位符 {y}yVar 替换;
  • 占位符 {subTitle}subTitle 替换。

使用 F-Strings 进行文本替换

Python 3.6(适用于 SPSS 27 或更高版本)引入了 f-strings:我们可以使用先前定义的 Python 对象作为占位符名称,如果在字符串前面加上 “f”(代表 format ),则无需任何进一步的规范。

***使用 F-string 进行多次文本替换。**
begin program python3.
xVars = ['alco','cigs','exer']
yVar = 'costs'
subTitle = 'All Respondents | N = 525'
for xVar in xVars:
    print( f'''
GRAPH/SCATTER {xVar} WITH {yVar}
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '{subTitle}'.''' )
end program.

请注意,这与使用 locals() 非常相似。

如果需要,您可以将其与原始字符串结合使用,这基本上禁用了使用反斜杠的转义。

***原始 F-string 示例。**
begin program python3.
subFolder = 'ruben'
print( rf'd:\data\new file\\{subFolder}\here')
end program.

使用百分号进行多次文本替换

Python 中一种较旧的文本替换方法是使用百分号表示的转义序列:

  • 使用 %s 作为字符串的占位符;
  • 使用 %d 作为整数的占位符;
  • 使用 %f 作为 浮点数 的占位符。

在指定某个字符串之后,指定您的文本替换作为以百分号开头的元组。

***使用 % 进行多次文本替换。**
begin program python3.
xVars = ['alco','cigs','exer']
yVar = 'costs'
subTitle = 'All Respondents | N = 525'
for xVar in xVars:
    print( '''
GRAPH/SCATTER %s WITH %s
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '%s'.'''%(xVar,yVar,subTitle) )
end program.

Python Text Replacement With Locals

有点令人惊讶的是,%s 通常也适用于数字和字符串。

使用 locals() 进行多次文本替换

如前所述,您可以使用 f-strings 直接将 Python 对象插入字符串中。一种类似的老方法是 locals()。下面的语法展示了它的工作原理。

***使用 locals() 进行多次文本替换。**
begin program python3.
xVars = ['alco','cigs','exer']
yVar = 'costs'
subTitle = 'All Respondents | N = 525'
for xVar in xVars:
    print( '''
GRAPH/SCATTER %(xVar)s WITH %(yVar)s
/TITLE 'MY SCATTERPLOT'
/SUBTITLE '%(subTitle)s'.'''%locals() )
end program.

请注意,%(xVar)s 是(已经定义的)xVar 字符串对象的占位符。在定义某个字符串后添加 %locals() 确认所有占位符都将被局部变量替换:具有相同名称的先前定义的 Python 对象。

在结束之前,我应该指出,本教程中讨论的文本替换被称为 Python 字符串格式化。而且它比我在这里讨论的要 多得多

幸运的是,我们只需要基础知识就可以在 SPSS 中使用 Python 完成工作。