Bag of ML Words

ML = Machine Learning, Music Love, and Miscellaneous things in daily Livings

Python: ファイルとかディレクトリとか(随時更新)

Pythonの一ついいところはファイルの取り扱いも簡単ってとこですよね。

 

このエントリでは、いままでに遭遇したファイルの読み書きとかを

まとめていきます(随時更新!)

 

ファイルを開いて閉じる(読み取り、書出し、追記など)

基本のopen(), close()

これは組み込み関数ですね。

>>> f_r = open("hoge.txt", 'r')    # hoge.txtを読み込みで開きます。fはfile objectです

>>> f_w = open("homu.txt", "w")  # homu.txtを上書き書き込みで開きます

>>> f_a = open("sayaka.txt", "a")  # neko.txtを追記書き込みで開きます

 ファイルは取り敢えず開いてから扱います、基本的に。

で、処理が終わったらクローズします。面倒だ

>>> f_r.close()

>>> f_w.close()

>>> f_a.close()

withをつかう

sleepy_yoshi(http://d.hatena.ne.jp/sleepy_yoshi/)さんに教えてもらったやり方です。これは便利かもしれない。

 >>> with open("homu.txt") as fin:
...     for line in fin:
...             pass # do something
... 

>>> with open("homu.txt", "r") as fin, open("kyoko.txt", "w") as fout:
...     for line in fin:
...             fout.write("...")  # 複数ファイル同時開くもいける

 

ファイルを読む

普通のテキストファイ

readlines()とreadline()を基本的に使います。

readlines()はまるっと全行を読みますが、

redline()は1行ずつ読みます。読んだところは覚えています。

あと、先ほどのfor line in fin: もreadline()みたいな挙動ですね。

>>> fin = open("homu.txt", "r")
>>> lines = fin.readlines()
>>> type(lines)
<type 'list'>
>>> len(lines)  # ファイルの行数が自然にわかる
4
>>> print lines
['madoka\n', 'miki-sayaka\n', 'sakura-kyoko\n', 'incuvator']
>>>

>>> fin = open("homu.txt", "r")
>>> line = fin.readline() # 最初の行
>>> print line
madoka

>>> line2 = fin.readline() # 次の行
>>> print line2
miki-sayaka

>>> while line: # おわりまで読むやり方。まずlineが必要。面倒。
...     print line
...     line = fin.readline()
...
madoka

sakura-kyoko

incuvator
>>> fin.close()
>>>

>>> fin = open("homu.txt", "r")
>>> for line in fin:
...     print line
...
madoka

miki-sayaka

sakura-kyoko

incuvator
>>> fin.close()

ということで、普通はreadlines()を使います。

 

ただ、readlines()使ってると死亡するケースがあって、それはものすごく大きいファイルを読んで、各行からごく少量の要素だけ読み取るようなケース。

readlines()はまるっと全部をstring配列で読むので、重くなって死ぬ(MemoryError)ことがあります。

こういうときはreadline()や上記の"for line in fin"を使って1行づつ読んでは処理する方法を使う方がいいみたいです。

 

numpy array

numpy謹製のメソッドを使いましょう

 

ファイルを書く

普通のテキストファイ

基本的に1行づつ書くしかないんでしょうかね。

 

numpy array

numpy謹製のメソッドを使いましょう

 

 

 

 

ファイルやディレクトリの存在の確認

無いファイルを指定してもエラーなので、こういう存在確認は大事です。

これにはos.pathモジュールを使います。

>>> import os

>>> os.path.exits("./inu/neko/homu.txt")  # ファイルでもディレクトリでも反応

True

>>> os.path.isdir("./inu/neko")  # ディレクトリならTrue

True

>>> os.path.isfile("./inu/neko/homu.txt")  #ファイルならTrue

True

isdirとかは、たとえば再帰的にディレクトリ構造を降りていくときとか、見つけたパスがディレクトリなら更に潜って、ファイルならそこで処理、とかに使えますね。

 

ディレクトリを作る

isdir()で出力先のディレクトリがなかったら作る、とか。

>>> os.path.isdir("./inu/neko/tori") # まだない

False

>>> os.makedirs("./inu/neko/tori")

>>> os.path.isdir("./inu/neko/tori") # できた

True