とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub

Python ファイルの読み書きを行う

WindowsでPython シリーズ その26


今回はサラッとファイルの読み書きの基礎をまとめます。

ファイルの読み書きの手順


どのプログラム言語であれ、ファイルの読み書きの基礎は決まっています。

  1. ファイルを開く
  2. ファイルを読み書きする
  3. ファイルを閉じる

です。

これをPythonの命令後に置き換えると・・・

  1. ファイルを開く → open()
  2. ファイルを読み書きする → read() / write()
  3. ファイルを閉じる → close()

となります。
自分でマウスで開いてファイルの中身を見る時も同じですね。

手順通りにPythonコードを書く


とりあえず、Pythonコード(main.py)と読むためのテキストファイル(sample.txt)を用意しました。
Python ファイルの読み書きを行う


sample.txt の中身はこんな感じです。
「月が綺麗ですね。」
「は?」
「・・・・・」
ファイルはメモ帳で作ったので、S-JISのエンコードです。

作ったテキストファイルの中身を読んで、文末に追記したいと思います。
例によらず、マニュアルに沿って構文を確認
ファイルを開く方法はopen 関数を使うとあり、その引数を確認。
'r+' はファイルを読み書き両用に開きます。
とのことなので、このようなコードを書く。



実行結果
Python ファイルの読み書きを行う

sample.txt の中身もきちんと書き換わってますね。
Python ファイルの読み書きを行う

簡単に解説


とてもシンプルなので解説は不要かもしれませんが念のため
open()関数

open()関数にファイル名、オープンモード、文字のエンコードを指定しています。
今回は"s-jis"エンコードのファイルを開くので"sjis"を指定、そして、読み書きをしたいので引数を名前指定でmode="r+"としています。
この指定により、読み書きを行うモードでファイルを開くことになります。

read()とかwrite()とか

read で中身を読み込み、writeで末尾に指定した文字列を書いています。
ここで、"\n"としているのはなぜか・・・windowsユーザーなら"\r\n"としたいところですが、
こうすると、改行が余計に入って表示されました・・理由は謎です。いつか解明したい(誰かコメント下さい!

seek()関数

seek は、ファイルを読み込んだ場所を表します。
一旦readでファイルの最後まで読んで、文字を追記したので、読んだ場所はファイルの最後の位置にいます。
マウスカーソルで例えると、ファイルの最後にカーソルがある状態です。
readは、カーソルの位置から後ろを読み込むので、readした後にさらにreadしてもファイルの内容を読み込むことができません。
(ファイルを読むためのマウスカーソルが一番末尾にあるので、それ以降を読んでも意味がないと思ってください。)
よって、seek(0)の命令で、カーソル位置を一番最初に戻しています。

ファイルは閉じよう


最後に f.close() としているのは、きちんとファイルを閉じるという操作が必要だからです。
これを忘れると、ファイルが開きっぱなしになりますので注意してください。

今日はファイル操作の基礎中の基礎をやりましたが、プログラマとしては不十分です。
次回はきっちりとファイルを操作するお作法を勉強したいと思います。

テーマ:プログラミング - ジャンル:コンピュータ

Python PyPiでパッケージを探してインストールする

WindowsでPython シリーズ その25


とうとうここまできました。Pythonでのパッケージ利用。
Pythonの魅力の一つ、様々なパッケージが有志の方々によって多く公開されていることですね。
(他の言語にも、もちろんありますよ)

パッケージとは


Pythonでいうパッケージとは、複数のモジュールの「かたまり」のことです。
例えば「暗号化ファイルを作りたい」とか「色んな種類の圧縮ファイル作りたい」とか。
汎用的なやりたい事の殆どは、自分で組まずにパッケージを探して作るというスタイルでコーディングすることで解決できます。

Pythonのパッケージ一覧サイト


どんなパッケージがあるか?
ここ(https://pypi.python.org/pypi)で探します。
正直、パッケージを探し当ててもインストールするための構文が分からないとイライラするので、英文を読みふける必要がありそうです。
とか言ってても始まらないので、日本語のコチラの本を買い、進めていくことにしました。
内容的には、初心者が読むには十分な感じです。



パッケージ管理ツールPIP


Python3(2にもあるよ)には、PIPというパッケージ管理ツールが標準でインストールされています。
このPIPというツールを使って、パッケージをインストールしたりアンインストールしたりします。
パッケージをインストールすると、import 文を使ってそのパッケージを呼び出すことができるのですが、
バージョンによって書き方が異なるようです。

とりあえず、このブログを書く時にPythonをインストールしたのですが、PIPのバージョンが古いかもしれないので
バージョンアップコマンドを実行します。

コマンドは以下の通り
python -m pip install -U pip

Python PyPiでパッケージを探して利用する

うん。。。どうやら最新ぽいのかな?

QRコードを作るパッケージをインストールしてみる


QRコードを作成するパッケージを入れてみる。
これは、先程紹介した本に記載されているパッケージです。
QRコード作成のために、画像処理ライブラリである pillow というのもインストールする必要があるので合わせてインストールしてみます。
が、、、Windows環境では本の通り記載してもNGでした。

どうもpip に対して、構文が間違っている的なエラーがでましたので、Windowsで通用する書き方でやってみます。

PIPに対してインストール要求


流したコマンドがコチラ
python -m pip install pillow crcode


結果がこちら
Python PyPiでパッケージを探して利用する

どうやら、pillow のインストールはうまくいったけど、qrcodeの方はバージョンがどうとか言われました。
qrcode 5.3
パッケージを探してみたら、5.3 が最新らしい。
pipに対してどうやって指定したらいいかわからんので、次のコマンドを流してみます。
python -m pip install "qrcode 5.3" crcode


ものすごい怒られた
Python PyPiでパッケージを探して利用する

よく分からんので、単品でインストール要求をしてみた。
python -m pip install "qrcode"


いけ・・・たのか??
Python PyPiでパッケージを探して利用する

パッケージがインストールされるフォルダの前後を比較してみた。
パッケージがインストールされる場所、デフォルトでいじってなければここにあるそうです。
C:\Users\(ユーザー名)\AppData\Local\Programs\Python\Python36-32\Lib\site-packages

で、コマンド実行前と後で比較してみます。

インストール前
Python PyPiでパッケージを探して利用する

インストール後
Python PyPiでパッケージを探して利用する

うん、、、なんとなくいけてるぽい。。。
この当たりは申し訳ないですが、後々詳しく調べて記事にしたいと思います。

今日はパッケージをインストールして利用するのがゴール!

QRコードを作るパッケージの呼び出し


さて、pipによってパッケージがインストールされているならば、
いつものようにimport して qr作成コマンドを呼び出せば
パッケージに入っているqrコード作成モジュールが動くはず!

このブログのURLをQR作成コードにするプログラムコード


これで動くはずなんだが・・・

結果的には。。。エラーの画像を取得し忘れましたが、めっさエラーが出ました。

すぐ消したので忘れて申し訳ないですが
Image というオブジェクトが無いとか・・・

これはきっと pillow のインストールが正しくできてないんだと予想。
で、もう一度pillowのインストールを実行
python -m pip install pillow


さっきと結果が違う。。。もうわかんね。後で調査することが増えていやだなぁ。。
Python PyPiでパッケージを探して利用する

なんか、新しくなったぽい?
もう一度QR作成コードを呼び出してみる。

エラーは出てないし、ファイルも作られている!!!!!!
Python PyPiでパッケージを探して利用する
Python PyPiでパッケージを探して利用する

QRコードもできてる~!
Python PyPiでパッケージを探して利用する

はい、、、というわけで這々の体で本に書かれてることが実行できました。

反省点


・記事や本を読んでも、あくまでも「その時点」の情報であり、情報は刻一刻と新しくなっている
・「一気にまとめてやる」系の事は、実際に自分でやる場合はばらして実行する方が良い
・本の通りいかなくても焦らずに、一つ一つ振り返ってみる
・英語は頑張って読む

こんな感じでしょうか。
それにしてもパッケージインストールにここまで手こずるとは・・・

テーマ:プログラミング - ジャンル:コンピュータ

Pythonで日付型を扱う

WindowsでPython シリーズ その24


Pythonの日付型、datetime型はモジュールとして定義されています。
利用する時は、import datetime を指定します。

日付型の利用宣言


日付型のマニュアルに沿って、早速コードを書いてみます。


実行結果
Pythonで日付型を扱う

d.datetime.now()
2017-07-07 01:28:26.004739
となります。

日本人としてはあまり馴染みのある表示ではないので、これを書式指定して表示します。

t.strftime("%Y年%m月%d日(%a) %H時%M分%S秒")
2017年07月07日(Fri) 01時32分29秒
となります。

書式指定の方法は 8.1.8. strftime() と strptime() の振る舞い を参考にしています。

strftimeは、文字列のformatのようなもので、書式を %● とすることでお目当ての値を文字列として表示できます。

%●に何が利用できるかの詳細はマニュアルに全て記載されていますが、よく利用する書式指定については
最低でも次のものを覚えておけばよいでしょう。

書式意味
%Y西暦(4桁)
%m月(2桁)
%d日にち(2桁)
%H24時間表記で時(2桁)
%M分(2桁)
%S秒(2桁)
%w曜日を表す数字(0:日曜日、1:月曜日…)
%a曜日名の短縮形
%%文字列の'%'を表示する


%mだけは中尉ですね。 %mで月、%Mで分になります。

Pythonで親階層に存在するモジュールのimport

WindowsでPython シリーズ その23


今回は親のディレクトリにあるmodule呼び出しを行います。
フォルダ構造は以下のように配置し、 call_parent.py ファイルから、parent.py で定義されたモジュールを呼び出します。
E:.
│ parent.py

└─child
call_parent.py


Pythonでは、最初に実行したファイルがルートディレクトリになる


Pythonでimportをする場合、パスが通って無くてはなりません。
実行しているモジュールより下の階層に存在する場合は前回やりましたが、自身より上位ディレクトリに存在するモジュールを呼び出す場合はパスを通す必要があります。

Pythonマニュアルの
sys.path
を参考にコードを書いてみます。

まずは親のコードから


んで、親のコードより下の階層にある child/call_parent.py


sys.path.append('../') #←ここが大事

このコマンドが全てですが、
この状態で、子供のモジュールを実行します。
sys.path に相対パスを指定し、自分より親ディレクトリをimportの検索パスに指定しているわけです。

実行結果がこちら。

Pythonで親階層に存在するモジュールのimport

sys.path.append('../') をコメントアウトするとこうなります。

Pythonで親階層に存在するモジュールのimport

Pythonでは、実行ファイルがルートディレクトリとして扱われる


Pythonを始めて実行したファイルがルートディレクトリになるという決まりがあるので
できれば最も上位のディレクトリにmain.pyを作成して、必要に応じて必要なファイルをimportするのがよさそうです。

いろんなブログを見ていると、Pythonのimportは何かとトラブルの元になるようですので
ファイルを分ける際にはパスの参照を意識して書いていきましょう。

Python 実践的なimportの書き方

WindowsでPython シリーズ その22



Python モジュール定義の基礎の基礎でimport処理の基礎をやったけど、多分実践では使えない。

というわけで、今日はモジュールのimport処理についてまとめます。

別ディレクトリのimport方法


main.py を作って、そこから子ディレクトリのモジュールを呼び出します。
階層は以下の通り。
main.py

└─【util】
   │ custom_print.py
   │
   └─【calc】
        math.py

【】でくくられているのがディレクトリです。
main.pyから、utilのcustom_print.pyと、さらに子改装にあるmath.pyを呼び出します。

それぞれのファイルは以下の通り
math.py


custom_print.py


main.py


実行結果
Python 別ディレクトリのimport方法
解説
import キーワードで別階層のモジュールを呼び出したい場合は「.」(ドット)で区切ります。
さらに子階層の場合は同じように「.」(ドット)をつなぎます。
importしたモジュールを呼び出したい場合も同じようにimportした名前をドットでつなぎます。
うん。使いにくい。

実際に使えるimport宣言


importの書き方を試してみたけど、いちいち
util.custom_print.write_line(util.calc.math.add(1,2))
なんて書いてられない。
長すぎる。

というわけで、Pythonにはimport宣言方法が色々あるんだけれども
コレだなという書き方をメモしておきます。

import処理の書き方


実行結果
Python 使えるimportの書き方

多分この2つの書き方が一番いい。
解説
2つの書き方をしたので解説します。
from (モジュール名『ファイル名』) import (関数名) as (別名)

from util.custom_print import write_line as printline


このように書くと、特定のファイルから、どの関数を、こんな名前で呼び出す宣言ができる。
対して

import (モジュール名『ファイル名』) as (別名)

import util.calc.math as math

と書くと、特定のファイルを別名で呼び出すことができるという指定になる。

前者の方は、モジュールの中の特定の関数を宣言する。
後者の方は、モジュールをのものを別名で宣言する。

という挙動になっている。

モジュール(ファイル名)の位置が、fromの後ろかimportの後ろかで異なっていることは注意したい。

このように定義することで

util.custom_print.write_line モジュールのwrite_lineを printline として呼び出しているし
util.calc.math モジュールをmathの別名で指定し、その中の関数を呼び出すことができる。

まとめてimportする方法


ちなみに、import文はカンマで続けて書くことができる。
import file1, file2, file3
こんな感じ。
個人的には明確に何をimportしているかひと目で分かるようにしたいのでimport文は改行して全部書いた方が良い気がします。

importの大切さ


同じファイルに処理を書きすぎると人間の脳味噌がついていかないから、
それなりの規模のプログラムをする場合にファイルを分ける。
その場合、import無しというのは考えられない。

というわけでこの処理は非常に大切です。

今回はmain.pyが最も上流階層に存在する場合の例を書いたけど、それもそんなわけには行かない場合がありますね。
次回は親階層に存在するモジュールのimportを記載します。
では!

前のページ 次のページ

FC2Ad