在 Python 中从 SPSS 访问标签时如何处理特殊字符?

How to handle special characters when accessing labels from SPSS in Python?

我通过 Python 访问 SPSS 数据库。我从那里获取所有需要的信息:变量名、变量标签、值标签等

但是当我到达标签时,我无法将它们设置为 UTF-8(数据集中就是这种情况,当我使用 SPSS 打开数据时它们得到支持并正确显示)。

这里对我来说主要的问题是,在我获得所有需要的信息之后,我想写一个 XML 文件(使用 LXML),但这会给出一个 UnicodeEncodeError。

我不知道最后如何在XML中得到更正的标签。 .encode('utf-8') 没有改变任何东西,所以我真的不知道是否有办法做到这一点?

我的代码:

import spss,spssaux
from datetime import date
mysyntax=r"""GET FILE="C:\Users\file.sav"."""
spss.Submit(mysyntax)

today_date=date.today().strftime('%Y-%m-%d')
vardict = spssaux.VariableDict()
var_list = []
var_labels = []
var_values = {}

spss.StartDataStep()
datasetObj = spss.Dataset()

index = 0
for var in datasetObj.varlist:
    varObj = datasetObj.varlist[index]
    var_list.append(varObj.name)
    var_labels.append(str(varObj.label)).encode('utf-8')
    var_values[var.name] = str(var.valueLabels).encode('utf-8')
    index += 1

spss.EndDataStep()
spss.StopSPSS()

编辑::

这是我读取 SPSS 文件的代码的结果,所以我创建的列表:

我的 L 代码XML:

import lxml.etree
import lxml.builder    

new_xml = lxml.builder.ElementMaker()
date = new_xml.date
survey = new_xml.survey
record = new_xml.record
variable = new_xml.variable
name = new_xml.name
label = new_xml.label
nvars = len(var_list)
for i in range(nvars):
    final_xml =(date(survey(record(
                    *[variable(
                            name(str(var_list[i])),
                            label(str(var_labels[i])),
                            ident = str(i+1)) for i in range(nvars)],
                    ident = 'A'))),
                today_date)

newxml = lxml.etree.tostring(final_xml, xml_declaration=True, encoding='utf-8', pretty_print=True)

它向我抛出这个错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xea' in position 9: ordinal not in range(128)

我也试过在得到如下标签后对其进行编码:

for labels in var_labels:
    labels = labels.encode('utf-8')

在Python中看起来不错,但是当我到达LXML部分时,我仍然遇到同样的问题。

这是一个可重现的代码:

from datetime import date

var_labels = [u'À quelle fréquence?', u'Comment ça se passe?']
var_list = ['Q1', 'Q2']
today_date=date.today().strftime('%Y-%m-%d')


import lxml.etree
import lxml.builder    

new_xml = lxml.builder.ElementMaker()
date = new_xml.date
survey = new_xml.survey
record = new_xml.record
variable = new_xml.variable
name = new_xml.name
label = new_xml.label
nvars = len(var_list)
for i in range(nvars):
    final_xml =(date(survey(record(
                    *[variable(
                            name(str(var_list[i])),
                            label(str(var_labels[i])),
                            ident = str(i+1)) for i in range(nvars)],
                    ident = 'A'))),
                today_date)

newxml = lxml.etree.tostring(final_xml, xml_declaration=True, encoding='utf-8', pretty_print=True)

在Python2中,str(unicode_string)unicode_string.encode("ascii")相同。您的标签中有非 ASCII 字符。

如果将 str(var_labels[i]) 更改为 var_labels[i],错误应该会消失。