csvデータの加工
いつものように備忘録として。。。
csvファイルの読み込み
python SCRIPTFILE csv_file elements
という感じで使うことを前提。elementsは抽出したい要素を指定(複数可)
csvファイルの書式は下の通り
ID,SEX,AGE,Pref,... 1,0,33,25,... 2,1,24,10,... ...
まずはファイルを読み込んで内容を返す関数を作成
def readFile(filename): print 'reading ',filename,'...' read_file = open(filename,'r') reader = csv.reader(read_file) list = [] for line in reader: list.append(line) return list
まずハマったのは、csv.readerで取得したオブジェクト?からfor文で配列に入れるところ。
ファイルに書きこんで実行。じゃなくてインタプリタで試行錯誤してたからハマった問題やな。。
一度for line in reader:を回して処理をしてしまうとreaderの中身は空になってしまう。
print readerでオブジェクトの存在は確認できるのに、reader=csv(ryとやらずにfor分からやろうとするとリストにうまくデータを格納できなかった。
csvファイルへ書き込み
↑と同様に関数を作成
def writeFile(write_datum,filename): print 'writing ',filename,'.csv...' write_file = file(filename + ".csv","w") writer = csv.writer(write_file,lineterminator="\n") i = 0 while(i < len(write_datum)): writer.writerow(write_datum[i]) i = i + 1
write_datumの中身は↓のとおり
[ ['AGE', 'MARRIAGE'], ['40', '1'], ['49', '2'], ['45', '1'],...]
リストへの追加方法はappendとextendを使う方法があるんだが、違いが分からなかったので試してみた。
その前にcsvから任意の行を抽出する関数を作成
def extractColumns(list,elements): #要素が存在しなければ中止 write_datum = [] rows = [] datum = [] #抽出する要素が存在するかチェック、存在するならリストに追加 for element in elements: if not element in list[0]: print element,'is not exist!' quit() n = list[0].index(element) rows.append(n) #1行ごとにwrite_datumに追加 #["list[i][row1]","list[i][row2]"...]という感じ #csvファイルでは list[i][row1],list[i][row2]...というようになる i = 0 while(i < len(list)): datum = [] for row in rows: datum.append(list[i][row]) write_datum.append(datum) i = i + 1 return write_datum
datum.append→datum.extendに変えると↓のように変わる。
[ ['A', 'G', 'E', 'M', 'A', 'R', 'R', 'I', 'A', 'G', 'E'], ['4', '0', '1'], ...]
write_datum.append→write_datum.extendに変えると↓のように変わる。
['AGE', 'MARRIAGE', '40', '1', '49', '2', '45',...]
datum.append→datum.extend、write_datum.append→write_datum.extendに変えると↓のように変わる。
['A', 'G', 'E', 'M', 'A', 'R', 'R', 'I', 'A', 'G', 'E', '4', '0', '1', ...]
ソースコードは続きに乗せておくので興味がある人はどうぞ(^_^)つ旦
# -*- coding: utf-8 -*- #for python2.6 #usage: python process.py csv_file elements import csv import sys ############ # # # 関数定義 # # # ############ #filenameを読み込んで内容をリストとして返す def readFile(filename): print 'reading ',filename,'...' read_file = open(filename,'r') reader = csv.reader(read_file) list = [] for line in reader: list.append(line) return list #write_datum[]をfilename.csvとして書きこむ def writeFile(write_datum,filename): print 'writing ',filename,'.csv...' write_file = file(filename + ".csv","w") writer = csv.writer(write_file,lineterminator="\n") i = 0 while(i < len(write_datum)): writer.writerow(write_datum[i]) i = i + 1 #引数を取得、読み込むファイル、抽出する行を設定 def conf(): arg_list = sys.argv #引数が足りなければ通知 if len(arg_list) < 3: print 'USAGE: python process.py csv_file elements' quit() return arg_list #csvから任意の行を抽出、elementsは配列 def extractColumns(list,elements): #要素が存在しなければ中止 write_datum = [] rows = [] datum = [] #抽出する要素が存在するかチェック、存在するならリストに追加 for element in elements: if not element in list[0]: print element,'is not exist!' quit() n = list[0].index(element) rows.append(n) #1行ごとにwrite_datumに追加 #["list[i][row1]","list[i][row2]"...]という感じ #csvファイルでは list[i][row1],list[i][row2]...というようになる i = 0 while(i < len(list)): datum = [] for row in rows: datum.extend(list[i][row]) write_datum.append(datum) i = i + 1 return write_datum ######## # # # 処理 # # # ######## args = conf() #抽出する要素を配列で取得 elements = args[2:] #csvファイル読み込み readfile = args[1] list = readFile(readfile) write_datum = extractColumns(list,elements) #filenameの作成 writefile = readfile[:-4] for x in elements: writefile += '_' + x[:3] writeFile(write_datum,writefile) print 'finished processing!'