mocchaso note

サーバーエンジニアが何か色々呟いているところ。

Python100本ノック 53本目~61本目

Python100本ノックを61本目まで進めたので、前回に引き続き、問題に関するメモや感想等を小分けして書いていきたいと思います。

qiita.com


53本目:以下の16進文字列が有名なGIFファイルであるか確認せよ。


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

16進数ダンプの復習でした。問題無く解けました。

  • バイト列として定義する場合、b"~"と定義しなければならない。

  • バイト列と文字列→比較することはできない。


54本目:test.txtというファイルにtest1の内容を書き込みなさい


ファイル書き込みの課題でした。問題無く解けました。


55本目:test.txtをtest2変数に読み出し、test1とtest2が同じになっているか確認せよ


条件:withを使うこと

問題無く解けました。q54とだいたい同じ設問でした。


56本目:次のテキストをbooks.csvというファイルに保存した後、その内容を変数booksに読み込み、booksの内容を表示しよう。


条件:csvモジュールとそのDictReaderメソッドを使うこと

どちらも初めて使ったので、調べました。
公式リファレンスを見ながらでしたが、何とか解けました。


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


linecacheライブラリは完全に初見でした。 これを使えばファイルの行数を一発で出せるようです...!


58本目:ファイルの行数を計算したい


ファイルを開いて地道に数える方法で解きました。
記事では、ファイルの各行を要素としたリストを返すメソッドのreadlines()を使っていました。とてもスマートですね!

オプションとして、openの中でrUのモードを指定すると、OSによって異なる改行モードの問題を解決できるようです。
rU:改行モードを無視できるファイル読み込みモード


59本目:many_books.dbというSQLiteデータベースを作り、その中にtitle(文字列)、"author"(文字列)、"year"(整数)というフィールドをもつbookというテーブルを作れ


条件:sqlite3モジュールを使うこと

sqlite3は全然使ったことが無かったので、メソッドを調べながら取り組みました。

  • sqlite3.connect()
    データベースへの接続を開設する(ユーザー名、パスワード、サーバーアドレス、その他引数が指定可能)

  • sqlite3.connect().cursor()
    クエリーを管理するカーソルオブジェクトを作る

  • sqlite3.connect().cursor().execute()
    データベースに対してSQLコマンドを実行する

  • sqlite3.connect().commit()
    データベースの変更を保存(コミット)する


60本目:次のテキストをmany_books.csvというファイルに保存し、そのデータをbookテーブルに挿入せよ。


(記事内ではq61とありますが、記事内の設問番号は恐らくズレています...)

解答の方針が分からなかったので、記事内の解法を見て考えました。
記事内の解法を実行したら、UnicodeEncodeErrorが出てしまいました...。
csvファイルの作成の段階で行うopenで、encoding="utf-8"を指定することで解決しました。


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


これも、解答の方針が分からなかったので、記事内の解法を見て考えました。
for row in db.execute(sql):と書けるのが新鮮でした。




今回は、ファイルへの書き込みとデータベースの操作についてでした。
どちらも、機械学習を利用した開発で使いそうですね。
特に、ファイルへの書き込みで学習データの整形等ができるようにしておきたいです(卒論で使う可能性浮上)。

また、自分の解法と記事内の解法を比較する形でコードを書いてみています。
ぎとはぶに上げていこうかなと思います。