《11》入出力(1)ファイル〈Python 2.x 版〉

実録:はじめてのプログラミング記事一覧
《11》入出力(1)ファイル

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
2009年1月28日(水)

今日の進捗

  • Tutorial: Classes
  • Python.use(better) -- セミナー研修テキスト
  • 行番号課題を「続・ひよ子のきもち」で公開
Comment
本人:野中 逆ポーランド課題を前倒しで完成させることができました。
担当:伊藤 「前倒し」という言葉を知って「いつか使ってみたい」と言っていたのが、こんなに早く実現したようです。この課題はいろいろな発展形があるので、そちらにも挑戦してみるといいでしょう。

行番号課題(1)ファイル

行番号課題の仕様を確認したので、これから、関数 body が完成するまでの過程を紹介します。

def body(name, start=1, end=None):
    s,n = _body(name, start, end)
    format = "%%%dd: %%s"%len(str(n))
    for i,e in enumerate(s):
        s[i] = format%(start+i, e)
    return s

関数 body は、テキストファイル name を読み込んで、先頭 start から末尾 end までの各行に「行番号を挿入したもの」を要素とするリストを生成します。ここでは、補助関数 _body のリターン値 s,n を利用します。
変数 s は、テキストファイルの各行を要素とするリストを保持します。変数 n は、テキストファイルの行数を保持します。そこで、行番号を表示するのに必要な桁数を求めて、それを文字列の変換指令 format に埋め込みます。すると、

>>> n=85; "%%%dd: %%s"%len(str(n))
'%2d: %s'

ここでは、n=85 になるので、そのリターン値として新たな文字列の変換指令 '%2d: %s' が得られます。これが、変数 format の値になって、行番号付きのソースコードの断片を生成します。すると、

>>> n=85; "%%%dd: %%s"%len(str(n))%(3,"as happy as happy can be")
' 3: as happy as happy can be'

文字列の変換指令 '%2d: %s' に従って、整形された文字列が得られます。このとき、最初に空白文字があるのは、'%2d' になっているからです。

def _body(name, start=1, end=None):
    s = open(name).readlines(); N = len(s)
    if not end: end = N+1
    return s[start-1:end], N

補助関数 _body は、テキストファイル name を読み込んで、先頭 start から末尾 end までの各行を要素とするリスト s を生成するとともに、テキストファイルの行数 N をリターン値にします。
ファイルの内容を読み込むには、組み込み関数 open を利用します。メソッド file.readlines を利用すると、テキストファイルの各行を要素とするリストが得られます。引数 start を省略すると、ファイルの先頭行から読み込みます。引数 end を省略すると、ファイルの末尾行まで読み込みます。

Tips:コードの断片を実行時に生成する

行番号を表示するのに必要な桁数は、ファイルの行数によって確定します。そのため、コードの断片を実行時に生成する方法が必要になります。ここでは「変換指令」を含む文字列の内容が、ファイルの行数に合わせて変化します。《うさぎ》

Tips

Python 3 では、文字列の変換指令に代わる Tips が必要です。この話題は、関連記事で紹介します。《ひよ子》

Last updated♪09/03/06