在 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]
,错误应该会消失。
我通过 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]
,错误应该会消失。