みろりHP


緑色さんの多目的ブログ
みろりえいちぴー
ごゆるりとおくつろぎあさーせ。
<< C# CSVファイル、CSVリソースを配列化する関数 | main | アコギ Mr.Big『To Be With You』 >>
| カテゴリ:プログラミング |
Python CSVファイル、CSVリソースを配列化する関数



先日の「C# CSVファイル、CSVリソースを配列化する関数」ですけどね。C#書くのは楽しめたけど、やっぱり「お気に入りのpyてょんと比べてどうも長ったらしいな」と、思ったわけよ。というわけで「1日1Python」の時間です。あっちと比べてホントに長ったらしいのか、実際にPythonで同じものを書いて試してみようじゃねーか。
あっちと同じ順番で書いてみる。
  • 1. 改行を含むCSVファイルを用意
  • 2. CSVをリソースに追加
  • 3. 今回作ったCSV二次元配列化関数
  • 4. 作った二次元配列を確認する関数を準備
  • 5. 実行
  • 6. 結果
  • (7. exe化)



1. 改行を含むCSVファイルを用意しとく
0,緑色,Midori-iro,"みどりいろ"
1,うぇる,Weruda,"ウェル
ダ"
これは前と同じ。

2. CSVをリソースに追加しとく
「リソースに追加する」ってのはC#だと「Visual Studioのリソース欄に追加する」って意味になるけど、そんなコトはpythonじゃできん。だけれど、CSVファイルをexeファイルに含めることはできないけれど、pyファイルをexeファイルに含めることは当然できることから、「CSVファイルの中身をpyファイルに埋め込んでpyファイルとしてプログラムに埋め込む」っつー手法を思いついた。以下のようなファイルを DEFAULT_CSV.py として準備。
# coding: utf-8
text = '''
0,緑色,Midori-iro,"みどりいろ"
1,うぇる,Weruda,"ウェル
ダ"
'''

3. 今回作ったCSV二次元配列化関数
import os,sys,csv,pprint
import DEFAULT_CSV       # デフォルトのCSVをこういう形でリソース化
from io import StringIO  # 後述。python2と3で読み込み方が違うトコ注意

# カレントディレクトリをプログラムのある場所、
# あるいはexeファイルの場所に移動する
def cd_():
    # cx_freezeで固めるとコレがTrueになる。
    if hasattr(sys, 'frozen'):
        os.chdir(os.path.dirname(sys.executable))
    else:
        os.chdir(os.path.dirname(os.path.abspath(__file__)))
cd_()

# 二次元配列化の関数
def foo(csv_path, default_csv_module):
    lis = []
    if os.path.isfile(csv_path):
        # しーえすぶい.csvがあればそれを使う
        print('しーえすぶい.csvを使います')
        with open(os.path.realpath(csv_path), 'r', encoding='UTF-8') as f:
            for row in csv.reader(f):
                lis.append(row)
    else:
        # ない場合はリソース(DEFAULT_CSV.py)を使う
        print('DEFAULT_CSV.pyを使います')
        for row in csv.reader(StringIO(default_csv_module.text.strip())):
            lis.append(row)
    return lis
カレントディレクトリ移動は「一石二鳥」とか「DialogFrame」あたりで学んだマイノウハウ。exe化するスクリプトには、なんとなくこれをつけておかないと不安になっちゃうだけで、本件にはあんまり関係ない。
StringIOモジュールは、手順2で用意した文字列をファイルオブジェクトに変換するのに必要。csv.reader()は文字列を直接扱ってはくれないようで、このワンクッションがいるみたい。

4. ついでに、作った二次元配列を確認する関数を準備
pprintを使うんで作る必要なし。pprintサンにはいつもお世話になってます。

5. 実行
# リソース用の引数にはモジュールをそのまま渡す
a = foo('しーえすぶい.csv', DEFAULT_CSV)
pprint.pprint(a)

6. 結果

オーケイだね。

7. exe化
ついでに今回のスクリプトのexe化に使ったcx_freeze設定を。以下のexe化ファイルを
python cx_freeze.py build
で実行。
# cx_freeze.py
import sys
from cx_Freeze import setup, Executable
exe = Executable(
    script = 'csv_read.py',
    # 出力が欲しいプログラムではbaseをNoneにするコト。
    base = None,
)
setup(
    name = 'CSVread',
    version = '0.1',
    executables = [exe],
)



8. 結論
長さでいえば当然、pythonに軍配が上がったかな。でもそれ以上に、CSV文字列を埋め込んだpyファイルをC#でいうところのリソースとして扱うっつー思いつきが面白かった。この我流感!


| 緑色 | プログラミング | comments(0) |
| カテゴリ:- |
スポンサーサイト
| スポンサードリンク | - | - |









     12
3456789
10111213141516
17181920212223
24252627282930
<< September 2017 >>
+ みろりHP内検索
+ 閲覧記事
+ 過去記事アーカイブ
+ カテゴリ
+ 年月選択
  • 2017年 09月 (3)
  • 2017年 08月 (6)
  • 2017年 07月 (8)
  • 2017年 06月 (4)
  • 2017年 05月 (7)
  • 2017年 04月 (8)
  • 2017年 03月 (7)
  • 2017年 02月 (10)
  • 2017年 01月 (6)
  • 2016年 12月 (8)
  • 2016年 11月 (8)
  • 2016年 10月 (5)
  • 2016年 09月 (5)
  • 2016年 08月 (7)
  • 2016年 07月 (9)
  • 2016年 06月 (6)
  • 2016年 05月 (8)
  • 2016年 04月 (10)
  • 2016年 03月 (10)
  • 2016年 02月 (8)
  • 2016年 01月 (9)
  • 2015年 12月 (9)
  • 2015年 11月 (6)
  • 2015年 10月 (5)
  • 2015年 09月 (4)
  • 2015年 08月 (8)
  • 2015年 07月 (5)
  • 2015年 06月 (3)
  • 2015年 05月 (7)
  • 2015年 04月 (8)
  • 2015年 03月 (12)
  • 2015年 02月 (8)
  • 2015年 01月 (4)
  • 2014年 12月 (5)
  • 2014年 11月 (5)
  • 2014年 10月 (7)
  • 2014年 09月 (4)
  • 2014年 08月 (7)
  • 2014年 07月 (6)
  • 2014年 06月 (4)
  • 2014年 05月 (12)
  • 2014年 04月 (9)
  • 2014年 03月 (6)
  • 2014年 02月 (6)
  • 2014年 01月 (8)
  • 2013年 12月 (7)
  • 2013年 11月 (10)
  • 2013年 10月 (10)
  • 2013年 09月 (9)
  • 2013年 08月 (11)
  • 2013年 07月 (10)
  • 2013年 06月 (9)
  • 2013年 05月 (15)
  • 2013年 04月 (11)
  • 2013年 03月 (5)
  • 2013年 02月 (7)
  • 2013年 01月 (6)
  • 2012年 12月 (9)
  • 2012年 11月 (10)
  • 2012年 10月 (10)
  • 2012年 09月 (4)
  • 2012年 08月 (2)
  • 2012年 07月 (7)
  • 2012年 06月 (13)
  • 2012年 05月 (13)
  • 2012年 04月 (15)
  • 2012年 03月 (4)
  • 2012年 02月 (12)
  • 2012年 01月 (9)
  • 2011年 12月 (5)
  • 2011年 11月 (13)
  • 2011年 10月 (2)
  • 2011年 09月 (2)
  • 2011年 08月 (1)
  • 2011年 06月 (1)
  • 2011年 05月 (4)
  • 2011年 04月 (10)
  • 2011年 03月 (8)
  • 2011年 02月 (11)
  • 2011年 01月 (14)
  • 2010年 12月 (14)
  • 2010年 11月 (17)
  • 2010年 10月 (17)
  • 2010年 09月 (19)
  • 2010年 08月 (22)
  • 2010年 07月 (18)
  • 2010年 06月 (16)
  • 2010年 05月 (19)
  • 2010年 04月 (15)
  • 2010年 03月 (22)
  • 2010年 02月 (18)
  • 2010年 01月 (18)
  • 2009年 06月 (2)
  • 2009年 04月 (1)
  • 2007年 12月 (10)
  • 2007年 11月 (7)
  • 2007年 10月 (9)
  • 2007年 09月 (4)
  • 2007年 07月 (5)
  • 2007年 06月 (11)
  • 2007年 05月 (6)
  • 2007年 04月 (4)
  • 2006年 01月 (20)
  • + ブックマーク
    + 最近のコメント
    + アクセスカウンター
    全体(since 2010.02.03.)
    今日… 昨日…