RによるPISAの分析(データの準備)で公開したpythonコードですが、その後、PISA2000のspsファイルに対応していなかったとか、すべての国のデータをまとめて変換したほうが便利だとか、ファイル名を入力するのが面倒だとか、いろいろ思うところがあり、少し修正しました。
新しいスクリプトは、spss_all.pyです。例によってLinuxしか動作検証していませんが、PISA2000から2012までの学校・生徒データに対応しており、spsファイルを利用して、txtファイルをcsvファイルに変換することができます。
使い方は、端末を開いて、以下のようにします。
python spss_all.py INT_STU12_SPSS.sps INT_STU12_DEC03.txt
すべての国のデータを変換するので、少し時間がかかります。
コードは、下記のようになります。必要な方はコピペしてどうぞ。
#!/usr/bin/env/python3 # coding: utf-8 """ spss_all.py spsファイルを使って、PISAデータのtxtファイルをcsvファイルにコンバートします。 spss.pyからの変更点 1.すべての国のデータを一括変換します。 2.ファイル名は、txtファイルのファイル名を利用します。 例えば、INT_STU12_DEC03.txtを変換すると、INT_STU12_DEC03.csvが生成されます。 3.PISA2000のspsファイルに対応しました。 使い方 "python spss_all.py INT_STU12_SPSS.sps INT_STU12_DEC03.txt" """ import csv import sys import os.path import re argvs = sys.argv argc = len(argvs) if argc != 3: print('引数は、"spsファイル"、"txtファイル"が、この順番で必要です。') quit() if os.path.splitext(argvs[1])[1] != '.sps': print('最初の引数は、spsファイルでなくてはなりません。') quit() if os.path.splitext(argvs[2])[1] != '.txt': print('2番目の引数は、txtファイルでなくてはなりません。') quit() # SPSファイルから固定幅データを得る x = [] y = [] var = [] for text in open(argvs[1]): spss = text.strip(' /.\n') line = spss.replace('-', ' - ') if len(line.split()) >= 4: if line.split()[1].isdigit() and line.split()[3].isdigit(): x.append(line.split()[1]) y.append(line.split()[3]) var.append(line.split()[0]) # 書込ファイルの準備 name = os.path.splitext(argvs[2])[0] filename = name + '.csv' w = open(filename, 'w') write = csv.writer(w) # 変数名を書込 write.writerow(var) # データを固定幅で切ってcsvで書込 for line in open(argvs[2]): list = [] for i in range(len(x)): list.append(line[int(x[i])-1:int(y[i])]) write.writerow(list) # 後始末 w.close()