とまと あんらいぷ…

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

GitHub
スポンサードリンク

Python ファイルを1行ずつ読んで改行を消す

WindowsでPython シリーズ その28



今回はファイルを1行ずつ読む方法です。
前回までのファイルの読み方は、
ファイルの中身を一気に変数に取り込む方法でした。
#2.テキストを読む
s1 = f.read()
read()関数は、ファイルの中身を一気に変数に格納します。

ファイルの中身が膨大な時、これでは都合が悪い時があります。
メモリ不足に陥るのですね。

ファイルを1行ずつ読む


ファイルを1行ずつ読むことでメモリ不足に対処します。
ここでいう1行とは、改行コードまでです。
WindowsでいうとCRLFつまり\r\nまでなので、バイナリデータを読む場合には適用できませんが、
それでも何らかのテキストファイルを処理する時には大いに役立つはずです。

enumerateを使う


ファイルを1行ずつ読む方法は、enumerateにopenしたファイルオブジェクトを指定します。
このあたりは、リストとかタプルでやりました。
要するに、「行番号:1行の文字列」を返してくれます。

コードを書いてみます。


読み込むテキストファイルはこんなの
AAAAA
BBBBB
CCCCC
DDDDD
NGEEE
FFFFF


※FFFFFの後ろにも改行があります。

実行結果

Python ファイルを1行ずつ読んで改行を消す

なんかいやな改行が出てますね。
テキストファイルに改行が含まれているので、それがそのまま出力されているようです。

改行を消して出力する


改行なしで出力したいので、改行コードを消して表示させます。
ついでに"NG"と記載のある行は表示しないようにさせます。


実行結果
Python ファイルを1行ずつ読んで改行を消す

ちょうどNGから始まる行は除外されて表示されました。
そして改行も消えてますね。

キモはlineをスライスしている[:-1]です。
その7(スライスってなんぞ)で説明した画像を見てください。
WindowsでPython その7(スライスってなんぞ)
-1は、「末尾から一つ手前の場所まで」ということなので、改行を覗いて表示されています。
注意点は、末尾に改行がなかった場合はFFFFFがFFFFとなって表示されてしまうことです。

そうしないためには、replaceで改行を除去する方法が良いかと思いますが、
ちょっとPythonらしく書くためにあえてスライスを使ってみました。

おまけ


コードにfind関数を使っています。
これは指定した文字列のIndexを返す関数なので、
line.find("NG") == -1:
で"NG"が見つからなければprintするということになっています。

1行ずつ読むことで、ファイルの中身を判断しながら、何かゴニョゴニョできそうですね。
将来的にはS-JISを他の文字コードに変換するようなプログラムを組みたいと思ってますので、今回はその布石でした。

それでは!
▼この記事を読んだ方は、こんな記事も読んでいます。▼

スポンサードリンク

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://dalmore.blog7.fc2.com/tb.php/189-6669d428
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad