Python初級プログラミング(4)
2023/08/15
do one thing and do it well(一つのことをうまくやれ)
  • Python初級プログラミングでは関数を扱いません。まずは小さなプログラム/スクリプトを組み合わせて使うことを念頭に置いています。これはセクションタイトルにある "do one thing and do it well" ... UNIX哲学から来るものです。

  • 多くのデータ処理は標準入出力とフィルタを経由すれば、単機能プログラムを組み合わせて実現できます。小さなプログラミングを繰り返すことで言語へ慣れると同時に、無駄な開発回避/自動化IF構築について考えることができるようになります。

  • Python初級プログラミングの最後として、標準入出力を経由したデータのread/write、あとは念のためですがテキストファイルのread/writeを扱います。

Python初級プログラミング(4):目次

標準入力(stdin)からのデータ入力:sys.stdin.readlines(): [目次へ]
  • sysライブラリをインポート(import)して、stdinのreadlines()メソッド使用。
  • 標準入力(stdin)なので当然だが、パイプ(|)もリダイレクト(<)も対応。
  • 下記サンプルコードにはライブラリインポートと、print文の改行指定(end=)も入っている。
  • シフトJISのファイルを入力しているが、UTF-8との変換をやってくれている(*1)。これはすごいこと。
  • import sys
    
    list_a = sys.stdin.readlines() # ここでutf-8に変換されている
    
    for str_a in list_a:
        print(str_a, end='') # 行末付加抑止。デフォルトはend='\n'と同じ。
    
    [Readファイル: 031_sample.txt (文字コードはシフトJIS)]
    1行目データ
    2行目データ,001,A
    3行目データ,002,B
    
    [リダイレクト入力(<)]
    >031_sample.py < 031_sample.txt
    1行目データ
    2行目データ,001,A
    3行目データ,002,B
    
    [パイプ経由入力(|)]
    >type 031_sample.txt | 031_sample.py
    1行目データ
    2行目データ,001,A
    3行目データ,002,B
    

標準出力(stdout)へのデータ出力: [目次へ]
  • print()関数のデフォルト出力先は標準出力。ファイル化はリダイレクト(>)使用。下記サンプルは','をタブに変換。
  • Python初級プログラミングでは、stdoutとstderrの使い分けをOS側の機能で対応。
  • import sys
    
    list_a = sys.stdin.readlines()
    
    for str_a in list_a:
        print(str_a.replace(",", "\t"), end='') # \tはタブのエスケープシーケンス
    
    [画面出力]
    >032_sample.py < 031_sample.txt
    1行目データ
    2行目データ     001     A
    3行目データ     002     B
    
    [リダイレクトによる出力のファイル化]
    >032_sample.py < 031_sample.txt > 032_sample.txt
    


テキストファイル入力: [目次へ]
  • open()で開く。with文とペアの使用が推奨。例外発生時にファイル(オブジェクト)をcloseするため。
  • 対象ファイルの文字コードがOS環境のデフォルト値と異なる場合encoding指定要。下記はOS環境別デフォルト値。
    • Windows: シフトJIS/CP932
    • MacOS: UTF-8
    • Linux: UTF-8
  • 主なencoding指定は下記。
    • シフトJIS/CP932: shift-jis
    • UTF-8: utf-8
    • 日本語EUC: euc-jp
    • JIS: iso-2022-jp
  • 下記サンプルはEUCコードのテキストファイル読み込み。ファイル名指定のコマンドライン引数取得含む。
  • import sys
    
    if len(sys.argv) > 1:   # コマンドライン引数チェック
        fname = sys.argv[1] # 入力ファイル名(fname)取得
        
        with open(fname, encoding='euc-jp') as fo: # EUC想定でファイルopen
            list_a = fo.readlines()  # 全行をリストにRead
            
            for str_a in list_a:
                print(str_a, end='') # 表示
    else:
        print("入力ファイル指定無し")
    
    [Readファイル: 033_sample.txt (文字コードは日本語EUC)]
    1行目データ
    2行目データ     001     A
    3行目データ     002     B
    
    [出力]
    >033_sample.py 033_sample.txt
    1行目データ
    2行目データ     001     A
    3行目データ     002     B
    

テキストファイル出力: [目次へ]
  • 入力と同じく出力もopen()で開く。with文とペアの使用が推奨なことも変わらず。
  • overwrite:上書き('w')か、append:追加('a')の指定が加わる。
  • encodingの扱いも入力と同じ。
  • import sys
    
    if len(sys.argv) > 1:     # コマンドライン引数チェック
        fname_i = sys.argv[1] # 入力ファイル名取得
        
        with open(fname_i, encoding='euc-jp') as fo_i:
            list_a = fo_i.readlines()
    else:
        print("入力ファイル指定無し")
    
    if len(sys.argv) > 2:     # コマンドライン引数チェック
        fname_o = sys.argv[2] # 出力ファイル名取得
        
        with open(fname_o, 'w') as fo_o: # 上書きモードで文字コードはデフォルトのshift-jis
            for str_a in list_a:
                fo_o.write(str_a.replace("\t",",")) # タブをカンマに置換してwrite
    else:
        print("出力ファイル指定無し")
    
    >034_sample.py 033_sample.txt 034_sample.txt
    
    >type 034_sample.txt
    1行目データ
    2行目データ,001,A
    3行目データ,002,B


最後に
  • Python初級プログラミングは今回で終了になります。関数を対象外にしているため、初級プログラミングで扱うコードはMax50行程度でしょう。書いてみるとわかりますが、変数名が思いつかなかったり忘れたりして、視界の外にある情報を扱うのは苦しいからです。

  • つまり「Max50行」は「1画面でコード全体が見える行数」(*2)です。これが今後コーディングを行う際の単位になります。これ以上は関数を使って構造化しますが、結局それらも50行以内を基準として記述することになります。

  • よって関数を使用したコーディングでは「論理構造化」が必須となりますが、プログラミング入門段階では頭がパンクする要因になります。それならば、まずは入力/出力によって区切り構成し、バッチファイル等で結びつけを行いながら「論理構造化」を体感する方が学習効率は高いです(私見ですが)。

  • またバッチファイルやシェルスクリプトによる連携を利用すると下記のコンピュータ利用センスが身に付きます。
    • 餅は餅屋。積極的な外部ツール/コマンドの利用。効果の低い再開発を避ける姿勢。
    • 自動化に必要なのはコマンドラインIFであるという認識。
    • 利用データはマシンリーダブルにすべきという感覚。ヒューマンリーダブル(*3)はただの見世物。

  • 今回のレポートは初級プログラミングとしてはいますが「他の言語の知識/経験がある」ことを前提としているため、端折りも多いです。ピンと来ない言葉はGoogle先生に聞きながら眺めてみて下さい。次は「中級プログラミング」にて。
Notes
  • Windowsのコマンドプロンプトはcp932(shift-jis)であることをPython環境別sysライブラリで処理している。
  • だから画面が「80x25」の頃は「25行以内」が基準でした。
  • なので「ビュー(view)」という言い方をすることも。
Copyright(C) 2023 Altmo
本HPについて