SPSS赢得';在Python中打开数据集

SPSS赢得';在Python中打开数据集,python,dataset,spss,Python,Dataset,Spss,我正在尝试使用python脚本操作SPSS数据集。问题是,我的代码无法打开活动数据集。问题在于: spss.StartDataStep() dataset = spss.Dataset() print len(dataset.cases) 如果我手动打开一个.sav文件并运行代码,这段代码将创建一个datasetobject。但在我的程序中,它只是创建了一个空数据集,即使我显然有一个活动数据集在运行。我该如何解决这个问题 以下是错误: 回溯(最近一次呼

我正在尝试使用python脚本操作SPSS数据集。问题是,我的代码无法打开活动数据集。问题在于:

spss.StartDataStep()                     
dataset = spss.Dataset()
print len(dataset.cases)
如果我手动打开一个.sav文件并运行代码,这段代码将创建一个datasetobject。但在我的程序中,它只是创建了一个空数据集,即使我显然有一个活动数据集在运行。我该如何解决这个问题

以下是错误:

回溯(最近一次呼叫最后一次):
文件“”,第128行,在
ValueError:\uuuu len\uuuu()应返回>=0

BEGIN PROGRAM.
import SpssClient,spssaux, spss, os
SpssClient.StartClient()
path='c:\users\myDocs\'

def inlezen(path,filename):
            if filename.startswith("Dec_gemeente"): 
                           vars=' /1 Code1 0-3 A4   Label1 4-33 A30'
            if filename.startswith("Dec_post"): 
                           vars=' /1 Code1 0-3 A4   Label1 4-27 A24   Code2 28-32 A5  Label2 33-67 A35'
            if filename.startswith("Dec_etniciteit_kort"): 
                           vars=' /1 Code1 0-0 A1  Label1 1-23 A23'
            if filename.startswith("Dec_etniciteit_lang"): 
                           vars=' /1 Code1 0-1 A2  Label1 2-33 A32  Code2 34-34 A1  Label2 35-58 A24  Code3 59-59 A1  Label3 60-95 A36'
            if filename.startswith("Dec_geslacht"): 
                           vars= ' /1 Code1 0-0 A1  Label1 1-8 A8'
            if filename.startswith("Dec_landcode"): 
                           vars=' /1 Code1 0-3 A4  Label1 4-43 A40  Code2 44-44 A1  Label2 45-56 A12  Code3 57-58 A2  Label3 59-89 A31'
            if filename.startswith("Dec_nationaliteit"): 
                           vars=' /1 Code1 0-3 A4  Label1 4-43 A40  Code2 44-44 A1  Label2 45-56 A12  Code3 57-58 A2  Label3 59-89 A31'
            if filename.startswith("Dec_verbl"): 
                           vars=' /1 Code1 0-1 A2  Label1 2-84 A83'

            bestand=path+filename

            spss.Submit("""
            DATASET CLOSE ALL.
            GET DATA
            /TYPE=TXT
            /FILE='%s'
            /FIXCASE=1
            /ARRANGEMENT=FIXED
            /FIRSTCASE=1
            /IMPORTCASE=ALL
            /VARIABLES=%s.
            DATASET NAME LabelSet WINDOW=FRONT.
            DATASET ACTIVATE LabelSet.
            EXECUTE."""
            %(bestand,vars))



def wegschrijven(filename):

            labels1=''
            labels2=''
            labels3=''

            # Labels maken 1.
            varnaam=filename

            labels1='VAR LAB' + ' ' + varnaam + " '" + varnaam + "'" + '.' + '\n' + 'VAL LAB'+' '+varnaam
            for i in range(len(dataset.cases)):
               for j in range(2):
                  if j==0:
                     temp=str(dataset.cases[i, j])[2:-2]
                     labels1 = labels1 + '\n' + temp + ' '
                  if j==1:
                     temp=str(dataset.cases[i, j])[2:-2]
                     labels1 = labels1 + "'" + temp + "'"
            labels1=labels1+'.'


            try:
               # Labels maken 2.
               varnaam='test'
               labels2='VAR LAB' + ' ' + varnaam + " '" + varnaam + "'" + '.' + '\n' + 'VAL LAB'+' '+varnaam

               for i in range(len(dataset.cases)):
                  for j in range(2,4):
                     if j==2:
                        temp=str(dataset.cases[i, j])[2:-2]
                        labels2 = labels2 + '\n' + temp + ' '
                     if j==3:
                        temp=str(dataset.cases[i, j])[2:-2]
                        labels2 = labels2 + "'" + temp + "'"
               labels2=labels2+'.'
            except:
               labels2=''
               print 'geen var 2'

            try:
               # Labels maken 3.
               varnaam='test'
               labels3='VAR LAB' + ' ' + varnaam + " '" + varnaam + "'" + '.' + '\n' + 'VAL LAB'+' '+varnaam

               for i in range(len(dataset.cases)):
                  for j in range(4,6):
                     if j==4:
                        temp=str(dataset.cases[i, j])[2:-2]
                        labels3 = labels3 + '\n' + temp + ' '
                     if j==5:
                        temp=str(dataset.cases[i, j])[2:-2]
                        labels3 = labels3 + "'" + temp + "'"
               labels3=labels3+'.'
            except:
               labels3=''
               print 'geen var 3' 



            output= labels1 + '\n' + '\n' + labels2 + '\n' + '\n' + labels3
            print output

            # Output naar syntaxdoc schrijven

            NewSyntaxDoc = SpssClient.NewSyntaxDoc()
            NewSyntaxDoc.SetAsDesignatedSyntaxDoc()

            # Inhoud syntax wijzigen.
            NewSyntaxDoc.SetSyntax(output)

            # Syntaxdocument opslaan.
            pad='I:/geg/WON/1 cijfer/LABELS/spsfiles/Labelbestanden/'+filename+'.sps'
            NewSyntaxDoc.SaveAs(pad)




for root, dirs, files in os.walk(path):
      for filename in files:
          inlezen(path,filename)

          # Toegang krijgen tot data editor.
          spss.StartDataStep()                     
          dataset = spss.Dataset()
          print len(dataset.cases)


          # Wegschrijven labels naar .sps.
          wegschrijven(filename)  
          dataset.close()  
          spss.EndDataStep()             
END PROGRAM.

以下内容对我来说很好(它提供了一个印回,确认活动数据集中有474个案例):


我假设是os.walk(path):中root、dirs和文件的代码行出现问题,特别是它正在拾取的文件,然后尝试运行其余代码。试着调试/评估哪些文件正在被循环…

好的,所以经过一天的激烈尝试后,我想出了一个解决办法

显然,GET DATA命令没有正确地将数据集加载到内存中。我添加了一个saveoutfile和GET FILE命令,现在它运行良好

以下是我的解决方案:

spss.Submit("""
            DATASET CLOSE ALL.
            GET DATA
            /TYPE=TXT
            /FILE='%s'
            /FIXCASE=1
            /ARRANGEMENT=FIXED
            /FIRSTCASE=1
            /IMPORTCASE=ALL
            /VARIABLES=%s.
            DATASET NAME LabelSet WINDOW=FRONT.
            DATASET ACTIVATE LabelSet.
            EXECUTE."""
            %(bestand,vars))

            spss.Submit("""SAVE OUTFILE ='c:\user\myDocs\TEMP.sav'.
            GET FILE ='c:\user\myDocs\TEMP.sav'.""")

这会将数据集正确加载到内存中。我仍然认为这是SPSS的怪异和不直观的行为。谢谢你的回答。这让我走上了正确的方向。

这对我来说也很好:

begin program.
import spss
spss.Submit(r"""

GET DATA 
  /TYPE=XLS 
  /FILE='C:\Program Files\IBM\SPSS\Statistics\23\Samples\English\demo.xls' 
  /SHEET=name 'demo' 
  /CELLRANGE=full 
  /READNAMES=on 
  /ASSUMEDSTRWIDTH=32767.

""")
spss.StartDataStep()                     
dataset = spss.Dataset()
print len(dataset.cases)
end program.

我通过调用
GET DATA
并打开Excel文件进行了测试,效果很好。我不方便,您的代码中有问题的是
获取数据
。我会再做一点彻底的测试,以确保它在所有情况下都能工作,这是您的解决方案。

原始代码中的一个潜在问题是未加保护的表达式path='c:\users\myDocs\'在Python中,反斜杠表达式很多表示转义序列,并被转换为它们所代表的内容,这对于路径来说是不幸的。在path=r'c:\users\myDocs\'中使用前斜杠或以r开头。在这种情况下,你是幸运的,但迟早你会被抓住

至于GET数据,它在必要时才会读取整个文件——EXECUTE语句将强制执行该操作,但这不应影响数据集的存在。但是,在读取整个文件之前,不知道案例的数量

begin program.
import spss
spss.Submit(r"""

GET DATA 
  /TYPE=XLS 
  /FILE='C:\Program Files\IBM\SPSS\Statistics\23\Samples\English\demo.xls' 
  /SHEET=name 'demo' 
  /CELLRANGE=full 
  /READNAMES=on 
  /ASSUMEDSTRWIDTH=32767.

""")
spss.StartDataStep()                     
dataset = spss.Dataset()
print len(dataset.cases)
end program.