Skip to content

ファイル入出力

Hidetsugu Takahashi edited this page Jul 25, 2014 · 7 revisions

ファイル入出力

概要

Pythonでのテキスト(アスキーデータ)ファイルの取り扱いについてざっくりと伝える。

今までのプログラムの悩ましい話

実はここで皆さんに衝撃のお話があります。
実は今まで学んできたプログラミングの知識では、プログラムの実行結果はプログラムが終了すると消えてしまいます。

これがどれだけ深刻かというと……

  • せっかく鍛え上げたRPGのキャラクターのセーブができません
  • ハイスコアが残りません
  • 商品の在庫状況が記録できません
  • 将来評価されるかもしれない傑作のポエムが残せません
  • 楽しかった夏の思い出も忘れられてしまいます

一番最初に言いましたね、
「コンビューターはその変数にどんな重要な情報があっても、命令があればすぐにそれを忘れて上書きしてしまう」
って。

しかし、「仕事が終わったら全て忘れ去られる」なんて嫌だ! ということはたくさんありますので、コンピューターにちゃんとノートやメモを取ってもらって記憶を記録にしてもらいます。

コンピューターにノートを取らせる

Pythonに限らず、多くのプログラミング言語では「机の上にノートを開く」動作が必要となります。
Pythonの場合は次のようになります。

file = open('note.txt', 'w')

解説していきましょう。open()メソッドはfileオブジェクトを返します。fileオブジェクトを経由することで、実際のファイル(今回は「note.txt」の読み書きを行います。

openメソッドの引数では「どこにあるファイルに注目するか」と「どんな読み書きをするのか」を指定します。
「どこにあるファイルに注目するか」ですが、今回は「note.txt」というファイルに注目します。「どんな読み書きをするのか」については「w」という文字が指定されています。

「どんな読み書きをするのか」についてですが、以下の表のように指定します。

やりたいこと 引数に指定する文字列
読み込みのみしたい r
ファイルに書かれている内容を全て消してから書き込みたい w
ファイルに書かれている内容の一番下に追記したい a
ファイルが存在する場合はエラーを返し、存在しない場合に書き込みたい x

ところで「note.txt」はどこにあるのでしょう。

実はw,a,xを指定した場合はファイルが新しくプログラムのファイルがある場所と同じところに作られます。
また、rの場合はプログラムのファイルがあるところにファイルがあるか確認し、なければエラーを返します。
では場所を指定する場合はどう書くのでしょう。絶対パス、もしくは相対パスを指定します。

TODO:絶対パスと相対パスについて書く?(別ページでも可)

さて、開いたノートの内容を把握するには読まなければなりません。当然の事を申しているようですが、コンピューターはそれをちゃんと命令しないといけません。
先ほどのコードの後に次のように記述します。

data = file.read()  # 改行記号で区切る必要がない場合はこちら

data = file.readlines() # 改行記号で区切られた文字列リストを使いたい場合はこちら

このようにしてコンピューターに読まれたノートの内容を、次は書き出してもらいます。もしかしたらお分かりかもしれませんね。

print(data)

読み取った文字列に関してはもちろん加工が可能です。例えば「行頭にアスタリスク(*)を付けたい」という場合は

# read() メソッドを使った場合
for line in data.split('n'):
    line = '* ' + line
print data

# readlines()メソッドを使った場合
for line in data:
    line = '* ' + line
print data

また、加工した文字列を保存したいと思います。その時は以下のコードを記入します。

file.write(data)

そしてちゃんとノートを閉じて収納しないと机の上からノートやメモの紙が落ちてしまうので、その指示もします。

file.close()

一連の流れをまとめると以下のようになります。(read()メソッドを使った場合です。)

flie = open('note.txt', 'w')
data = file.read()

for line in data.split('n')
    line = '* ' + line
print data

file.write(data)
file.close()

更に詳しい情報は7. 入力と出力 — Python 3.3.5 ドキュメントをご覧ください。

実は人間にも読める、あんなファイルこんなファイル。

ここからはプログラミングの話からは少し離れまして、コンピューターのファイル形式について見ていきます。

コンピューターの中のファイルは大きく分けると、全てがコンピューターが直接読み取れる「バイナリ形式」とファイルの内容自体は人間に読める文字列データで構成されており、コンピューターがコンピューターの言葉に訳すことによって演算を行う「アスキー形式」があります。
そしてその「アスキー形式」を開いて編集できるソフトウェアのことを「テキストエディタ」と言います。テキストエディタの代表例といえば、Windowsで最初から付いている「メモ帳」があります。

ではテキストエディタで開けるファイルにはどんなものがあるのでしょうか。

その前に、皆さんがコンピューターで色んなファイルを見ている時、ファイル名の後ろにドット(.)とアルファベットが並んでいるでしょうか? 表示されていない方は表示させるようにしてみてください。(「拡張子 表示」で検索してみると出てくると思います)
それらは「拡張子」と言われるもので、ファイルがどんな形式で書かれたかを大まかに表す文字列となります。

話を戻しましょう。テキストエディタで開けるアスキー形式として一番に上がってくるのは「.txt」という拡張子の「テキストファイル」でしょうか。

また、Webページの内容を記述しているのも「HTML(.html)」というアスキー形式です。
HTMLは実際にお使いのインターネットブラウザで「ページのソースを表示する」と言った機能で閲覧することができます。ここではその一端を上げてみます。

<html>
    <head>
        <title>コンピューターの気持ちになれるプログラミング教室</title>
    </head>
    <body>
        <h1>コンピューターの気持ちになれるプログラミング教室</h1>
        <h2>はじめに</h2>
        <p>
            そんなこんなでゆるくはじまりましたこのプログラミング教室<br>
            このプログラミング教室では何をやるのかと言いますと……
        </p>
        <p>
            ...中略...
        </p>
            最後まで読んでいただきありがとうございました。
        <p>
    </body>
</html>

これを実際にhtml形式で保存してインターネットブラウザで開くと、非常に簡素なWebページが表示されると思います。

htmlファイルの場合、コンピューターの言葉に訳して演算を行う役目をしてくれるソフトウェアが「インターネットブラウザ」であり、その結果として色んなWebページが表示されます。
他にもWebページを構成しているファイルとして「CSS(.css)」や「Javascript(.js)」といったマークアップ言語やプログラミング言語(それと多少の画像ファイル(JPEG, PNG, SVG, GIF, etc...))があります。

また、HTMLの親戚に当たるファイルで構造的なデータを表すのに使われるファイル形式として「XML」があります。

<!-- XMLは「タグ」と呼ばれる修飾子で要素を囲むのが特徴です -->
<library>
    <book>
        <title>千年後の世界</title>
        <author>海野十三</author>
        <summary>冷凍睡眠によってはるか未来に目覚めた主人公。その主人公が目にした未来の姿とは</summary>
    </book>
    <book>
        <title>ドグラ・マグラ</title>
        <author>夢野久作</author>
        <summary>目覚めると、真っ白な部屋で横たわっていた。ある狂気的な惨殺事件の重要人物となった私は、その真実を紐解くこととなる</summary>
    </book>
</library>

このように記述することでプログラムによって読み書きする際に扱いやすくなります。もちろんPythonにも「Element Tree」などの便利な道具があります。

また、他のデータの表現として「YAML(.yml)」や「JSON(.json)」と言ったものがあります。先ほどの書籍データをそれぞれ表してみます。

# YAMLはXMLと比べてシンプルですが、厳密な書き方のルールがあります。
# 1, ファイルの終わりは改行記号のみとする
# 2, インデント(字下げ)はスペースとする
# などです。
library: 
    - book: 
        title: 千年後の世界
        author: 海野十三
        summary: 冷凍睡眠によってはるか未来に目覚めた主人公。その主人公が目にした未来の姿とは
        
    - book:
        title: ドグラ・マグラ
        author: 夢野久作
        summary: 目覚めると、真っ白な部屋で横たわっていた。ある狂気的な惨殺事件の重要人物となった私は、その真実を紐解くこととなる
{
    "library": [
        {
            "book": {
                "title": "千年後の世界",
                "author": "海野十三",
                "summary": "冷凍睡眠によってはるか未来に目覚めた主人公。その主人公が目にした未来の姿とは"
            }
        },
        {
            "book": {
                "title": "ドグラ・マグラ",
                "author": "夢野久作",
                "summary": "目覚めると、真っ白な部屋で横たわっていた。ある狂気的な惨殺事件の重要人物となった私は、その真実を紐解くこととなる"
            }
        }
    ]
}

XMLやJSONに関しては1行で書き表すことも可能です。以下はJSONの例です。

{"library": [{"book": {"title": "千年後の世界","author": "海野十三","summary": "冷凍睡眠によってはるか未来に目覚めた主人公。その主人公が目にした未来の姿とは"}},{"book": {"title": "ドグラ・マグラ","author": "夢野久作","summary": "目覚めると、真っ白な部屋で横たわっていた。ある狂気的な惨殺事件の重要人物となった私は、その真実を紐解くこととなる"}}]}

もちろん、PythonではYAMLやJSONを読み込むための便利な道具が準備されています。
YAMLは「PyYAML」、JSONに関してはソースコードに import json と書き込めば使えます。

YAMLに関しては英語のページになってしまいますがPyYAML
JSONに関しては19.2. json — JSON エンコーダおよびデコーダ — Python 3.3.5 ドキュメントをご覧ください。

そして一番肝心な事を書き忘れていました。皆さんの書いているPythonのソースコードも「.py」という拡張子がついて、アスキー形式のデータで保存されております。
つまりPythonのソースコードはWindows標準の「メモ帳」でも編集できるのです!

このように、コンピューターのファイルの中には意外とアスキー形式で保存されているものがあることを少しでも感じていただけると幸いです。

まとめ

今回は次の事を頭の隅に残していただけると幸いです。

  • ファイルを読み書きする際はopen()メソッドで開き、使わなくなったらclose()メソッドで閉じる。
  • 実はテキスト(アスキー形式)で構成されているファイルがいくつもある
  • 構造的なアスキー形式のデータを便利に使う道具がPythonにはある。

余談 テキストエディタの紹介

ここまでの内容ではPythonのソースコードはIDLEで編集するようにお伝えしましたが、そろそろ
「IDLEが使いづらい、もっとシンプルな(もしくは高機能な)プログラミングソフトは無いのか」
と思いの方がいらっしゃるかもしれません。

今回お話したようにPythonのソースコードを記述したファイルはアスキー形式なので、文字コードがUTF-8のアスキー形式のデータを読み込めるテキストエディタであれば問題なく扱えます。
しかしテキストエディタという単語自体が初耳の方もいらっしゃると思います。なのでここで筆者の独断による「使えるテキストエディタ」を紹介します。

jEdit

jEdit - Programmer's Text Editor - overview

「Programmer's Text Editor」という宣伝文句に恥じない(であろう)よく出来たテキストエディタです。公式ページは英語ですが日本語表示も可能です。

Komodo Edit

Komodo Edit | Komodo IDE

機能としてはjEditにも劣らず、見た目もちょっといい感じのテキストエディタです。しかし少し起動がもたつくのと日本語表示ができないのが惜しいところです。

PyScripter

pyscripter - An open-source Python Integrated Development Environment (IDE) - Google Project Hosting

ここからは純粋にアスキー形式のデータを編集するテキストエディタだけの機能だけではなく、Python全般(Pythonのデバッグ機能など)にわたる機能も入っているIDEというものの紹介になります。その一つとしてこのPyScripterが上がります。

IDLEのように結果表示画面とエディタの画面が別々ではなかったり、構文チェック機能がなかなか強力だったり、動作が軽快だったりと、初めてのIDEとしても最適だと思われます。

PyCharm

Python IDE & Django IDE for Web developers : JetBrains PyCharm

僕の中では一番馬力のあるPython開発ツールです。どれくらい強力かというと、テキストエディタがモンキーレンチと手動のドライバーセットだとすると、PyCharmはエアーインパクトレンチやエアーインパクトドライバーの各種ボルトとネジ対応のセットくらいの力があります(例えとしては適切ではないかもしれませんが……)

もともとは有償のツールでしたが、去年の9月に「Community Edition」というものが出てきたため、今回このリストに入れさせていただきました。
筆者が使っているのもこのIDEです。

Vim

Vim - Wikipedia

またテキストエディタに戻りますが、最後はジョークとして聞いてください。

このテキストエディタを工具に例えると
「取っ手を自分好みに変えることのできるドライバーやレンチのセット」 です。ただし
「初めて使う人には『取っ手が異様な形で使いづらい』という感覚を覚える」
テキストエディタです。モーターバイクの用語で言うとピーキーです。

だけどそんなエディタだからこそ使い慣れると、テキストの編集が意外と早くなり、最終的にはVim以外のテキストエディタでもVimの操作をしているという事が起こります。

そういうエディタです、もし使おうと思った際には、起動した直後に:Tutorial打ち込み、Enterキーを押して使い方を知ることをおすすめします。 自分も週に3日以上このエディタを使うことがあります。

参考資料