《11》入出力(1)ファイル〈Python 2.x 版〉
実録:はじめてのプログラミング《記事一覧》
《11》入出力(1)ファイル
関連記事
今日の進捗
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:コードの断片を実行時に生成する
行番号を表示するのに必要な桁数は、ファイルの行数によって確定します。そのため、コードの断片を実行時に生成する方法が必要になります。ここでは「変換指令」を含む文字列の内容が、ファイルの行数に合わせて変化します。《うさぎ》