csvから入力データ作成

昨日のコメントによる擬似コードを実際のスクリプトで実装したものが以下になります。

# 1. csv からラベルと文字列データの組を作成し、入力データとする 
# file : 入力ファイル
# lang : 採用する言語
# return 成功したら (label, string) のタプルのリスト. 失敗したら None.
def input_from_csv(file,lang="日本語"):
  # csv ファイルを開く
  f=open(file)
  # if 失敗したら
  if f==None:
    # None を返す
    return None
  # 行のリストを作成する
  rows=[r for r in csv.reader(f)]
  # 1行目を取り出す
  r=rows.pop(0)
  # lang に対応する列を決める
  try:
    lang=r.index(lang)
  # if 決まらなかったら
  except ValueError:
    # None を返す
    return None
  if lang==0:
    return None
  # endif
  # 最終的なリストを作成する
  data=[(x[0], x[lang]) for x in rows]
  # リストを返す
  return data

言語の決定の部分がコメントと違ってますが、そもそもこのコメントの if は if 文というよりも
「もしも」という意味合いが強い(と思う)ので例外処理の形で実装しました。
あと、data=[(x[0], x[lang]) for x in rows]という部分で x の範囲のチェックをしていませんが
普通にツールから CSV を出力していたらこれで問題無いだろうと思います。
わざと破壊してあるデータだとどうなるか分かりません。 IndexError の例外処理をしたほうが
良いかもしれません。


この関数を以下のスクリプトで試してみました。

# テスト用
def print_data(lang):
  print "言語:"+lang
  data=input_from_csv("string_table.csv",lang)
  if data==None:
    print "データがありません"
  else:
    for d in data:
      print d[0], d[1]
  print "========"

# 実行
if __name__=="__main__":
  print_data("ラベル")
  print_data("日本語")
  print_data("英語")
  print_data("フランス語")
言語:ラベル
データがありません
========
言語:日本語
STR_HELLO こんにちは。
STR_BYE さようなら。
========
言語:英語
STR_HELLO Hello.
STR_BYE Good bye.
========
言語:フランス語
データがありません
========