進捗

4/25 14:30~17:00 p.378~p.379

osモジュールのrenames()で少しつまづいた。再帰的の意味がわからなかったのでこのページを見て調べた。例えばフォルダの名前をパスを含めて変更しようとする。その際、下層にフォルダが入っていたならそれも変える。さらにその下層にフォルダが入っていたらまた変える。繰り返しが続く。この繰り返しの処理を再帰的という。

この動画のコードを試したが名前を書き換える際、新しくフォルダが作成される。原因は1,2,3やa,b,cといった名前が短くてありふれていたからだ。別の名前に変えるとうまくいった。

進捗

4/24 18:00~19:00 p.378

ターミナルでのコマンドをpythonで行うosモジュールの学習に取り掛かった。os.chdir()やos.getcwd()で相対パス絶対パスについて学んだ。

相対パスが現在いるディレクトリから見たパスであるのに対して絶対パスはどの視点から見るかは関係なくディレクトリのパスを一番最初から書くパスのこと。このページここのページが参考になった。

進捗

4/23 17:00~18:10 p.377

sysモジュールの続きとわからない単語を調べた。

pathとはフォルダやファイルの場所のこと。pathを通すということはファイルを実行する際にpathの情報をコンピュータに登録し格納することで、pathを全部書かずに呼び出せること。このページここのページが参考になった。

環境変数とはターミナルにおけるパスなどを入れた変数のこと。このページが参考になった。

PYTHONPATHは環境変数でありモジュールを読み込む時に検索する場所を追加することができる。環境変数のpathの追加のコマンドと組み合わせて、PYTHONPATHに検索するディレクトリのpathを追加できる。このページが参考になった。

進捗

4/22 13:45~16:30 p.377

sys.stdoutについてどう動くのかこのサイトのコードを調べて動かした。

公式ドキュメントにも書いてあったが%を使う置き換えよりもf文字列やformat()を使ったほうがいい。

stdinやstdoutはファイルオブジェクトを開いているのでファイルオブジェクトに対して使えるreadline()やwrite()といったメソッドが使える。


>>> for i in range(5):
...     sys.stdout.write(f"the num is {i!r}")
... 
the num is 012
the num is 112
the num is 212
the num is 312
the num is 412
"""
インタラクティブシェルではこのように表示される。jupyternotebookでは数字が0から4まで表示される。
標準出力が両者では異なるのかと思う。標準入出力の仕組みを学ぶ必要がある。 """ """ format()を使うと中にintであるiを入れることになる。write()の中は文字列型なのでエラーになる。f文字列だとそうならない """

stdinを使うときも標準入力はインタラクティブシェルの対話の形で入力できた。jupyternotebookではできなかった。

flush()についてはここが参考になった。

進捗

4/19 8:00~8:30 19:00~21:00 p.376~p.377

pythonのシステムを扱うsysモジュールの学習に入った。
sys.exit()の引数に変数や文字、数字を入れることができる。何も入れなかったり、0を入れると正常終了になるが数字の1や他の引数を入れると1と表示されて異常終了になる。
確かめるのはecho $?というlinuxコマンドを使う。これはechoがターミナルで命令命令をする意味で$?が直前実行したコマンドを成功の0または失敗の1で表す。ここが参考になった。

sys.stdinを学習していて標準入力について調べた。input関数はjupyternotebookで実行できたがsys.stdinは実行できず苦しんだ。このページを参考にしてサンプルコードがターミナルのインタラクティブシェルで実行することができた。

進捗

4/18 7:30~8:30 12:30~14:45 p.374~p.375

このページを見て疑問が湧いた。raw文字列との兼ね合いを考えてバックスラッシュをつけたパターン文字列にraw文字列のrを付けると、バックスラッシュが二重になり、エスケープシーケンスではなく、そのまま文字として認識されるのでは無いかと思った。
調べた結果、杞憂に終わった。こういう書き方は公式ドキュメントにも書いてある。試しにドットをそのままの文字として認識させようとした場合にr"\."と書いた結果、狙った通りに認識された。もしかするとこの\\.から\.という文字が認識されるかもしれないと思った。そのようには動かなかった。
rを使わないで正規表現を書くことはシンプルだがバックスラッシュがどの文字と反応して特殊文字になるのかわからない。rを使ったからといって二重になった結果、意図したものとは違うことになるのでは無いかと考える必要はない。

webから通信したデータのレスポンスはpythonではutf-8エンコードされたbyte型。str型にするにはutf-8を指定してエンコードする。そのbyteからstrに使うメソッドはdecode()を使う。

p.375のコードではうまく作動しない。スペースもドットで表せる。検索する時、patternにタグを書くなら<a href>と省かずに書くと作動した。

findallで調べる時にpatternの中で一部分に()を使うと()でグループ化された箇所だけがマッチして返ってくる。。()を使わないとpattern全体でマッチした文字を返す。

groups()を使うとpatternの中で()でくくったグループのマッチオブジェクトが全て返ってくる。group()で引数なしだとpatternの中で()でくくってない正規表現もマッチした箇所をマッチオブジェクトとして返す。

進捗

4/17 p.371~p.374 13:00~15:00

reモジュールの続き、イテレータは反復可能な要素、つまり連続していてforに添えて取り出す時も確認の処理をしている。finditer()はマッチオブジェクトのイテレータを返す。

改めてまとめると、re.function(pattern,string,flags=0)とregexobj.method(string,pos,endpos)の形がある。
patternは正規表現パターン、stringは対象の文字列、flagsは検索オプション、posはstirngを調べる最初の位置、endposは最後の位置でendpos-1までがマッチする範囲

マッチオブジェクトに付くメソッドとしてgroup()がある。patternを与える際に()でグループ化した場合使える。group()の引数が無いならマッチしたグループの全体の文字を返す。引数に数字を入れることで数字の順に該当するグループの文字を返す。