課題

課題は順番にこなす必要はありません。面白そうだと思った課題にチャレンジしてみてください。

もちろんこれ以外に自分で課題を持っているならば、それをやってみるのも良いでしょう。

socketモジュールを使ってネットワーク通信

  1. socketモジュールを使って足し算を行うサーバを作成してください

    telnetコマンドで次のように 整数+整数 のように送信すると足し算の結果を返すサーバを作成してください。

    > telnet localhost 5000
    Trying 127.0.0.1...
    Connected to debian02.
    Escape character is '^]'.
    10+20
    30
    123+456
    579
    

Hint

socketモジュールを使って接続を待ち受け、接続されたら Hello, World! という文字列を返すコードは次のようになります。

server.py:

# coding: utf-8
import sys
import socket

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('127.0.0.1', 5000))
    s.listen(5)
    try:
        while True:
            conn, addr = s.accept()
            conn.send("Hello, World!\n")
            conn.close()
    except KeyboardInterrupt:
        sys.exit(0)

if __name__ == '__main__':
    main()

このスクリプトを実行するとlocalhostのTCP5000番ポートで接続を待ち受けます。

> python server.py

telnetで接続するとHello, World!という文字列が表示されて、切断されます。

> telnet localhost 5000
Hello, World!

Hint

  1. socketモジュールのドキュメントの例を参考に、サーバ側で受け取ったテキストを改行位置で分割します(“10+20”というデータになります)
  2. 分割したテキストの一つ目の要素を + でさらに分割します(“10”と”20”のデータになります)
  3. 分割したテキストを数値に変換し、足しあわせて、結果を送信します

http://www.python.jp/doc/release/library/socket.html

  1. socketモジュールを使って、1.で作成したサーバにデータを送信して、結果を取得して画面に表示するプログラムを作成してください

    引数を渡して実行すると結果を返してくれるようにしてみてください

    > python add.py 10+20
    30
    

Hint

sysモジュールのargvでコマンドライン引数を取得することができます。

http://www.python.jp/doc/release/library/sys.html

sqlite3モジュールを使ってデータベース作成

  1. sqlite3モジュールを使って、引数で与えられた品名と金額をデータベースに保存するプログラムを作成してください

    > python inputdb.py みかん 50
    > python inputdb.py りんご 100
    > python inputdb.py バナナ 200
    

Hint

sysモジュールのargvでコマンドライン引数を取得することができます。

http://www.python.jp/doc/release/library/sys.html

sqlite3モジュールでsqlite3のデータベースを操作することができます。

http://www.python.jp/doc/release/library/sqlite3.html

テーブルを作成するSQL:CREATE TABLE items (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, cost INTEGER);
データを挿入するSQL:INSERT INTO items(name, cost) VALUES("みかん", 50);
  1. 1で作成したデータベースの内容を一覧表示するプログラムを作成してください

    $ python listdb.py
    みかん 50円
    りんご 100円
    バナナ 200円
    

Hint

データを取得するSQL:SELECT name, cost FROM items;
  1. 引数から入力された金額以上の品物名とその品物の金額を表示してください

    > python filter.py 100
    100円以上の品物は、
    りんご 100円
    バナナ 200円
    

Hint

データを取得するSQL:SELECT name, cost FROM items WHERE cost >= 100;

csvモジュールを使ってCSVファイルの読み込みとデータ集計

次に示すCSVファイルは、果物屋の品物の売上レポートのデータです。

items.csv:

2012/06/01,りんご,2,100
2012/06/01,みかん,10,40
2012/06/02,りんご,3,100
2012/06/02,バナナ,3,200
2012/06/03,りんご,4,120
2012/06/03,みかん,5,50
2012/06/04,みかん,5,60
2012/06/04,バナナ,4,150
2012/06/05,りんご,1,100
2012/06/05,みかん,10,50

1列目は日付、2列目は品物名、3列目は販売した個数、4列目はその日の品物の1個あたりの価格です。ファイルの文字コードはShiftJIS(CP932)です。

  1. csvモジュールを使ってCSVファイルを読み込み、各品物ごとに合計の数を計算し、画面に表示するプログラムを作成してください

    $ python item_report.py
    りんご 10個
    みかん 30個
    バナナ 7個
    
  1. csvモジュールを使ってCSVファイルを読み込み、日付ごとの売上金額を計算し、画面に表示するプログラムを作成してください

    > python report.py
    2012/06/01 600円
    2012/06/02 900円
    2012/06/03 730円
    2012/06/04 900円
    2012/06/05 600円