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