「自作Python100本ノック」9日目（53本〜62本目）

「自作Python100本ノック」9日目です。

今日は1kmだけ走りました。
ランニングをした後Pythonの問題を解くというローテーションの毎日を送っています。
最強になれそうです。


さて、
「自作Python100本ノック」とはそもそも何ぞや？
どの程度のレベル感なのか？
どのように進めて行くのか？
など気になる方は詳しくは[こちら](https://qiita.com/ahpjop/items/373f807d68044cda1c9b#%E8%87%AA%E4%BD%9Cpython100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF1%E6%9C%AC5%E6%9C%AC%E7%9B%AE)に整理してありますのでまずはそちらを確認するようお願いします。
それでは始めていきます！

**引き続き[『入門　Python3』](https://www.amazon.co.jp/%E5%85%A5%E9%96%80-Python-3-Bill-Lubanovic/dp/4873117380)の内容を参考に今回も問題を作っている**ので、気になった方は本書を確認して見てください。

##Q53:　以下の16進文字列が有名なGIFファイルであるか確認せよ。
問題： 以下の16進文字列をbytes変数に変換し、その先頭が、”GIF89a”（有名なGIFファイル）という文字列になっているか確認せよ。

以前やった16進数ダンプのやり方と同じですね。
　　　

```q53.py
#16進文字列
hex_str = '47494638396101000100800000000000ffffff21f90401000000002c000000000100010000020144003b'

import binascii
gif = binascii.unhexlify(hex_str)
gif[:6] == b'GIF89a'   
#Unicode文字列ではなく、バイト列を定義するためにbを使わなければならないことに注意
#バイト列をバイト列を比較することはできるが、バイト列と文字列を比較することはできない。
```

##Q54:test.txtというファイルにtest１の内容を書き込みなさい
以前、ファイルの読み込みはやったので今回は書き込むバージョンです。
`with`を使ったやり方も練習しておきましょう。
　　　　

```q54.py
#text1
test1 = "This is a test of the emergency text system"

outfile = open("test.txt", "wt")
outfile.write(test1)
outfile.close()

#withを使うとclose呼び出しを避けることができる
with open("test.txt", "wt") as outfile:
    outfile.write(test1)
```

##Q55:test.txtをtest2変数に読み出し、test1とtest2が同じになっているか確認せよ
条件：`with`を使うこと

ほとんど前にやった問題とかぶっていますがご了承ください。
　　　　

```q55.py
with open("test.txt", "rt") as infile:
    test2 = infile.read()
    
test2
```
##Q56:次のテキストをbooks.csvというファイルに保存した後、その内容を変数booksに読み込み、booksの内容を表示しよう。
条件：csvモジュールとそのDictReaderメソッドを使うこと

csvファイルの読み込み方の練習です。
　　　　

```q56.py
##テキスト
text = '''author, book
J R R Tolkien, The Hobbit 
Lynne Truss, "Eats, Shoots & Leaves" '''

#保存
with open("books.csv", "wt") as outfile:
    outfile.write(text)

#読み込み 
import csv
with open("books.csv", "rt") as infile:
    books = csv.DictReader(infile)
    for book in books:
        print(book)
```

##Q57: テクストファイルの中から、行番号で指定した行を読みたい
　　　　

```q57.py
import linecache
theline = linecache.getline("text.txt", 3)
theline
```

##Q58: ファイルの行数を計算したい
　　　　

```q58.py
count = len(open("text.txt", "rU").readlines())
count
```

##Q59： many_books.dbというSQLiteデータベースを作り、その中にtitle(文字列)、"author"(文字列)、"year"(整数)というフィールドをもつbookというテーブルを作れ
条件：sqlite3モジュールを使うこと

SQLはGUIのアプリを使うことが多いと思うので実用性があるかわかりませんが一応。
（ちなみに私はPostgreSQLを使っていました。）
　　　

```q60.py
#データベースの作成
import sqlite3

db = sqlite3.connect("books.db")# connect()：データベースへの接続を開設する（ユーザー名、パスワード、サーバーアドレス、その他引数が指定可能）
curs = db.cursor()#クエリーを管理するカーソルオブジェクトを作る
curs.execute('''create table book (title text, author text, year int)''')# データベースに対してSQLコマンドを実行する

db.commit()

```


##Q61: 次のテキストをmany_books.csvというファイルに保存し、そのデータをbookテーブルに挿入せよ。
　　　
　
```q61.py
#テキスト
text = '''title,author,year
The Weirdstone of Brisingamen, Alan Garner, 1960
Perdido Street Station, ChinaMiéville,2000 
Thud!, Terry Pratchett,2005 
The Spellman Files, Lisa Lutz,2007 
Small Gods, Terry Pratchett, 1992
'''

#csvファイルの作成
with open("many_books.csv", "wt") as outfile:
    outfile.write(text)
    
#読み取り、挿入
import csv
import sqlite3

ins_str = "insert into book values(?, ?, ?)"

with open("many_books.csv", "rt") as infile:
    books = csv.DictReader(infile)
    for book in books:
        curs.execute(ins_str, (book["title"], book["author"], book["year"]))
        
db.commit()

```


##Q62: bookテーブルのtitle列を選択し、アルファベット順に表示せよ。
　　　　

```q62.py
sql = "select title from book order by title asc"
for row in db.execute(sql):
    print(row)
```


##感想
後半のデータベースを扱うやつはあまり実用性がないかもしれないので参考程度ということで。
ファイルの扱いは実務では基本中の基本なのでたくさん練習しておくことをお勧めします。
（「どうやってこのファイル読み込めば良いんですか。。」という質問をインターンですると恥ずかしいので（実体験））

次回は日時の扱いと、データフレームの扱い方を練習しようと思っています。
それが終わり次第、いよいよ文章題を解いていこうと思っています。
多分そこまで行けば、ChekiOが1人でもできるレベルになっていると思います！

それでは！

→ [10日目](https://qiita.com/ahpjop/items/f92fe9fcd8f39cd44952)