アグリな凡人が奮闘する話

大抵インフォ、時々バイオ、稀にアグリな日記。

やはりものごとは基礎から学ぶべき

Biopythonを学んでいてあまりに沼にハマるので結局pythonの基礎から学ぶことにした(遅い)

もう発見の連続。やっぱ基礎が大事ですな。

以下発見を書いていきます。

 

①ファイルに読み書きする。

ファイルを扱うとき、パスが必要。これは当たり前だが、自分はこれまでパスの取得に四苦八苦していた。わざわざフォルダのところまで行きファイル名コピーして戻る、など。

だがそのパスを自動で見つけてくれるモジュールがどうやらあるらしい。その名はos.path.join()関数。まじ。

import os

import os.path.join("Users","単語その1”,"単語その2”)

とするとその二つの単語が含まれているパス名を勝手に返してくれる。すごすぎ。ちなみにこうして得たファイルパスはどのOSでも動作するので非常に便利。

またprint(os.getcwd())を実行すればファイルが作られるフォルダがどこなのかもわかる。 

 

ファイルの上書きにはopen関数を用いる。

open("ファイル名(新しく作る場合にはそのファイル名)","ファイル形式(書き込みモードならw、読み出しモードならrなど。)",encoding="utf-8”(日本語など非アスキー文字を用いている場合。他の文字コードを使用しているファイルを開く場合にはそれを書く。シフトJISが使われている場合にはcp932を使う。))

として使う。

 

また今後よく使うであろうCSVファイルだが、基本的にはimport csvcsvモジュールを使う。csvファイルに書き出しの際にはまずwith openから始めるが、この際に引数にnewline=''としておかないと、一行おきに表示されてしまう。(Windowsだけっぽい?)

書き込み用にファイルを開いたなら次にcsv.writerを用いる。この際にdelimiter、文字同士を区切るものとしてカンマを指定する。カンマ以外でも指定でき、区切られた文字列はそれぞれ別のセルに格納される。

 

なので

with open('ファイルパス','w',newline='') as f:

    w = csv.writer(f,delimiter=",")

    w.writerow([])(writerowでリスト内の文字列を一つの行に入れる。数行入れたい場合は以降続ければよい。)

 

同様にcsvファイルを読み込みモードで開きcsv.reader(f,delimiter=",")でデリミタをカンマ指定、for row in f:で行を一つごと取り出して、print(",".join(row))で一行ずつ表示すれば終わり。

ちなみにjoinメソッドは(連結の間に入れるもの).join(イテラブル(繰り返し))で文字列同士を連結できる。今回はセルから文字列を一つずつ取り出してカンマで結合させている。

 

またここでオブジェクト指向についてまとめようと思う。

pythonは主にクラスという設計図によって具現化した、具体性を得たオブジェクトを用いている。ここでオブジェクトとインスタンスはほぼ同じ意味でつかわれる。

クラスの定義の仕方は

class [クラス名]:

    [スイート]

でできる。スイートには、クラス内でのみ有効な関数、メソッドを書く。メソッドはオブジェクト.メソッドのように、オブジェクトを通して呼び出せる。ここで、メソッドは最低一つ以上引数をもってなければならない。

selfという引数を持っていることが多いが、それはオブジェクト自分自身を引数にとっており、メソッドを渡したときにPythonが自動的に渡してくれる。

 

さて、クラスを作るときにまず必要なのはクラス内でのみ有効な変数を決定することである。これをインスタンス変数という。

インスタンス変数を設定するには初期化メソッド__init__を用いる。

__init__(self,変数1,変数2,変数3,変数4...):

    self.(変数1のメソッド名、属性名) = 変数1

 self.(変数2のメソッド名、属性名) = 変数2

...

という風に用いる。__init__でオブジェクトに具体的に持たせる属性を決めており、それをクラス内で使える変数に入れている。

 

ちなみにオブジェクトからメソッドを呼び出すとき、当然そのメソッド内で有効な変数を設定しなければならないので、(なければself)オブジェクト.メソッド()のように、後ろに()をつけなければならない。

()についてない形で、何か. somethingのようになっているときもあるが、このときsomethingはメソッドではなく、メソッド内部で定義された式である。すなわちメソッド内部ではメソッド. somethingがある操作をするようになっており、この操作の結果を示すのである。