pandasのデータフレームやなんかを使いたいけど
読みたいcsvファイルが日本語で、コードがShift-JISな場合、
ちょっとイヤな実装になる。
Python3に乗り換えれば幸せになれるのかな。
でも、GAEやなんかは、まだ当分2.7だろうし。。。
m2jの注文履歴のcsvとか。
予めcsvファイルをUTF-8に変換しておけば、文字コードを意識しなくて済む。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# coding: UTF-8 import sys, csv, json import pandas as pd import datetime as dt import numpy as np class OrderData: order = pd.Series() def __init__(self, orderfile): if orderfile != '': self.order = pd.read_csv(orderfile, parse_dates=True) def showItems(self, items): for i in items: if pd.isnull(i): print "", else: print i, print def showAll(self): for d in self.order.values: self.showItems(d) if __name__ == '__main__': import argparse parser = argparse.ArgumentParser(description='Order data importer') parser.add_argument('--order' , metavar='FILE' , help='WorkingOrderList csv file') parser.add_argument('--contract' , metavar='FILE' , help='ContractHistory csv file') parser.add_argument('--plan' , metavar='FILE' , help='TrapRepeatPlan json file') args = parser.parse_args() od = OrderData(args.order) od.showAll() |
ダウンロードしたままのShift-JISだと、
read_csvで encoding を指定しなければならない。
で、中で使われているstr型の文字コードはUnicodeかutfか、
何かに統一されているのかと思ったら、そうじゃないみたい。
なので、表示したり比較したりするたび
.encode(‘utf-8’) とか、つけないといけない。
場当たり的に対応してると、出来上がったコードは汚くなるなぁ。
良い方法はないものか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class OrderData: order = pd.Series() def __init__(self, orderfile): if orderfile != '': self.order = pd.read_csv(orderfile, parse_dates=True, encoding='Shift_JIS') self.order = self.order.iloc[:,[2,3,6,5,10,9]] def showItems(self, items): for i in items: if pd.isnull(i): print "", elif isinstance(i,basestring): print i.encode('utf-8'), else: print i, print def showAll(self): for d in self.order.values: self.showItems(d) |