ぐうたらパンダはお昼寝中

 全力でだらだらしてます。ぐうたらなので、書いていることは適当です。ときどき起きては,気が向いたこと書いています。プログラミングの記事は,Qiitaで書いています.

カテゴリ: プログラム

今週は忙しいので、小ネタ。

 前回までで書き込む数字は、なんとか準備ができましたが、今度は出力です。
 グラフィックファイルを作成する方法です。まずライブラリを読み込みます。


 import Image

ライブラリはPILという名前ですが、読み込みは、Imageという名前で読み込みます。次に白紙の画像を用意します。そうだ、文字コードの宣言も忘れていました。

# -*- coding: utf-8 -*-

import Image
img = Image.new('RGB', (1000, 1000), 'white')
Image.newで新しい画像を容易します。括弧の引数の意味は、まずRGBカラーの画像(透過画像の時はRGBAにするなどいくつか選択肢があるようですが、通常はRGBしか使わないでしょう)という指定。

その次は、画像の大きさです。幅と高さ。ここでは1000x1000の大きさを用意します。それから、最後は色です。とりあえず白にしました。名前で指定してますけど、何の色が指定できるのか、私は理解してないので調べることにします。 

次回は書き込む方法です。

前回は、タブ区切りテキストを読み込むことができました。読み込む単位は1行毎です。
1行を、X座標、Y座標、データの3つに分割して、それも多分最初は文字列でしょうから、数値に型変換をしなくてはなりません。

前回のコードはこれ
# -*- coding: utf-8 -*-

# ファイルを一行ずつ読み込む
with open('data.txt', 'r') as f:
    for line in f:
        print line  # この行はテスト用なので、消して続きを書く

 どうやって区切るか調べてみたら意外と簡単にできることがわかりました。
lineは文字列オブジェクトです。文字列にはsplitというメソッドが定義されています。書き方は、split('区切り文字')です。lineをタブで区切る場合、タブは、'\t' と書けばよいので、
    line.split(`\t`) 
となります。戻り値は、分割された単語 をリスト(配列)として返してきます。Pythonのリストは、例えばitemsというリストに、文字列を代入する場合、
    items = [ 'hoge1', 'hoge2', 'hoge3']
というように書きます。可変長なので、あらかじめ要素の数を宣言する必要はありません。配列が生成されたり使用されたりした時点で自動的に必要な大きさが確保されます。格納された要素にアクセスするには、番号を0から始めて、
    例えば、items[0] には 'hoge1' が格納されている。
となります。テキストファイルは読み込まれたときは文字列ですから、計算できるように数値に変換する必要があります。
  • 文字列を整数に変換する場合は、int(文字列)
  • 文字列を小数に変換する場合は、float(文字列)
を使用して変換します。

ということで、今回のコードは下記のようになります。 
# -*- coding: utf-8 -*-

# ファイルを一行ずつ読み込む
with open('data.txt', 'r') as f:
    for line in f:
        items = line.split('\t') # 読み込んだ1行をタブで区切って配列に代入
                                 # items = [ x, y, z] ただし、文字列として格納
x = int(items[0]) # 配列の1つ目は、整数に変換して、変数xに代入
y = int(items[1]) # 配列の2つ目は、整数に変換して、変数yに代入
z = float(items[2]) # 配列の3つ目は、小数に変換して、変数z代入

print x,y,z # テスト用のprint文
それにしても、ループの最後に何も書かないのには、どうも慣れません。

前回変なところで終わりましたが、実はコード書いていて早くも、ちょっとわからなくなったので保留にしたのです。コードは、まだ、これしか書いていません。
# -*- coding: utf-8 -*-

# ファイルを一行ずつ読み込む
with open('data.txt', 'r') as f:
    for line in f:

ちなみにテスト用data.txtはこんな感じです。X座標, Y座標, データです。数字と数字の間はタブです。
1	1	10
2	2	20
3	3	30
4	4	40
5	5	50

ということで、まず読み込んだラインをそのまま表示させてみることにします。data.txtはカレントディレクトリと同じところに置きます。
# -*- coding: utf-8 -*-

# ファイルを一行ずつ読み込む
with open('data.txt', 'r') as f:
    for line in f:
        print line
なんか違和感がありますね。いままで、触ってきた言語は、for~next とか do~while とか {} でくくる言語ばかりだったので、forの後のprint文で終わっているのを見ると、変な感じです。

動かしてみると特に問題なく動くのでこれで良いのでしょう。制御構文をインデントで記述するとは聞いてましたが、ブロックの最後を閉じるのに何も書かなくて良いとは思ってもいませんでした。

やっとコードを書き始めました。

まず文字コードの宣言をします。IDLEの環境設定でも utf8 を使うようにセットしてあるのでいらないかもしれないですが、書いておくことにします。

# -*- coding: utf-8 -*-

次にファイルを読み込まなくてはなりません。練習なのでとりあえずファイル名をdata.txtとします。

このテキストファイルは、

  • 各列の説明はなくいきなり一行目から、データが始まる。
  • 各行は3列からなっていてタブで区切られている。
  • 3列は、X座標、Y座標、数値の順に並んでいる。

という簡単なものです。

えーっと、フィルターといったかなんと言ったか忘れましたが、要するにこのファイルdata.txtを一行ずつ読む必要があります。withを使うのが最近のやり方のようです。withを使用する場合は、ファイルのクローズはお任せできるのでclose()する必要がなくなります。これは楽です。

# -*- coding: utf-8 -*-

# ファイルを一行ずつ読み込む
with open('data.txt', 'r') as f:
    for line in f:
  • with にはいろいろ使い道があるようですが、よくわからないので、ブロックに対してファイルを開く時に使う、ということにしておきます。
  • open() は引数に、ファイル名、その次にファイルをオープンするときのモードを指定します。'r'はファイルを読むというモードです。省略された場合は'r'になるそうですから、今回は省略できるのですが、練習ということで明示しておきます。その後は、バッファのサイズ等の指定ができますが、通常ファイルを開くときには、省略できます。
  • as 節で、以上の内容を f に代入します。
    • for 文でfから一行読み込んでは、line に代入し、読み込むファイルの最終行がくるまでそれを繰り返します。
今日は疲れたので、ここまで、次回はこのコードをテストしてみます。

インストールしたPythonのバージョンは2.7.3です。 

まず、注釈の書き方を覚えることにします。Pythonの注釈は、
# で一行コメントアウト
"""
'''
ダブルクオートやシングルクオート3つで囲うとブロックの注釈
この場合、ネストも可能
'''
"""
と書くようです。

ちなみに、こういうページを見つけました。注釈の書き方は、言語によって微妙にちがうのでこんがらがりますね。
コメントアウト記法まとめ 


それから、日本語の場合は特に文字コードの問題があるので、1行目に、
# -*- coding: utf-8 -*-
と書かないといけないようです。私も注釈を日本語で書こうとしただけで、いきなり怒られました。
なんでコメントアウトと同じ書き方なのか、等疑問は残りますが、当分、おまじないと思っておくことにしましょう。
これは必ず一行目か二行目にかかなくてはならず、それ以降には書いてはだめなようです。
Pythonで日本語を使う
言語コードの取り扱いに関しては、ここに解説されています。


このページのトップヘ