Yamamoto's Laboratory
 
環境設定
 
プログラム作成
  書き方
 
 ファイル
 
 
 
tkinter
 
 
 
 
 
 

はじめに

コンピューターを使ったデータ処理では,ファイルの入出力は大変重要です.通常,処理するデータは保管されており,処理された結果もファイルに保管されます.Python でのファイル操作は他のプログラミング言語と似ており,プログラミングの経験のある人はすぐに理解できるでしょう.ここでは,ファイル処理の基本的なことを説明します.

ファイル読み書きの基本構文

ここでは,最も単純な例を使いテキストファイルの読み書きのプログラミング方法を示します.単純な例ですが,応用範囲は広いと思います.

ファイルの読み込み

テキストファイルを1行ずつ読み込み処理するプログラムは,以下のように記述します.ファイル処理は,open() 関数でファイルオブジェクトを作成することから始めます.以下の例では,行毎にデータを読み込み,処理をします.行末まで処理が完了すると,

ファイルオブジェクト = open("ファイル名", "読み込みモード", encoding="文字コード")

for 文字列変数 in ファイルオブジェクト:
    文字列変数 = 文字列変数.strip()                          # 前後の空白文字の削除
    実行文
    実行文
    …
else:                                      # 無くても良い
    実行文
    実行文
    …
    ファイルオブジェクト.close()

ファイル読み込みの例(read_simple.py).

001   #!/usr/bin/python3
002   i=0;
003   
004   f = open("sample.txt", "r", encoding="utf-8")
005   
006   for x in f:
007       i += 1
008       print(i, "\t", x, end="")
009   else:
010       print("--------------------")
011       print("finish")
012       f.close()

4行目で,読み込み用のファイルオブジェクトを作成します.「for x in f:」で,(1)1行を読み込み,(2)変数 x に代入します.6 — 8行を,ファイル末尾まで繰り返します.ファイル末尾に達したら,10行目以降を実行します.8行目の「print(i, "\t", x, end="")」の end="" は,末尾に何も付けないという命令です.print 文は,デフォルトで改行を「"\n"」を付けます.「x in f」でも改行を読み込むので,行末に二つ改行が並ぶことを防ぎます.

このほかに,「readlines()」メソッドを使い行毎に読み込む方法もありますが,勧められた方法ではありません.

ファイルへの書き込み

ファイルの書き込みには,write() メソッドを使います.

ファイルオブジェクト = open("ファイル名", "書き込みモード", encoding="文字コード")

while ブール値:
    実行文
    文字列変数 = "フォーマット文字列".format(文字や数字のシーケンス)     # 文字列作成
    ファイルオブジェクト.write(文字列変数)
    実行文
    …
else:                                      # 無くても良い
    実行文
    実行文
    …
    ファイルオブジェクト.close()

ファイルへの書き込みの例(write_simple.py).

001   #!/usr/bin/python3
002   
003   f = open("sample.txt", "w", encoding="utf-8")
004   
005   x = 0
006   while x <= 20:
007       str = "{0:<d}\t{1:<d}\t{2:<d}\n".format(x, x**2, x**3)
008       f.write(str)
009       x += 1
010           
011   else:
012       print("finish")
013       f.close()

ファイルに書き込まれるタイミングは,プログラムの実行よりも遅延します.データはメモリーのバッファーに溜め込まれ,あるテイミングでファイルに書かれます.書き込まれる前に,そのファイルを処理すると,思わぬ結果になることが有ります.これを防ぐために,flush() メソッドを使います.「ファイルオブジェクト.flush()」を記述することで,バッファーのデータがファイルに強制的に書かれます.

open() 関数

使い方

ファイルを読み書きするためには,open() 関数を使いファイルオブジェクトを作成することからはじめます.

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • 引数 file は,ファイル名を記述します.もちろん,これは必須の引数です.
  • 引数 mode は,ファイルの使い方を指定します.

引数の詳細説明

モード (mode)

ユニバーサル改行モード 'U' は,後方互換のためのようです.そのため,新たにプログラムを作成するときには,使用しない方が無難です.

Python のエンコーディング (英語と日本語)
モード 動作
r読み込み用にファイルを開く.
w上書きモードで,書き込み用にファイルを開く.
x排他的な生成に開き、ファイルが存在する場合は失敗する
a書き込み用に開き、ファイルが存在する場合は末尾に追記する
bバイナリモード
tテキストモード (デフォルト)
+ディスクファイルを更新用に開く (読み込み/書き込み)
Uユニバーサル改行モード

エンコーディング (encoding)

Python で使えるエンコードについては,標準エンコーディングに書かれています.表 2 は,その中から英語と日本語です.

open 関数の引数でエンコーディング(encoding)が指定されていない場合に,テキストモードで使われるエンコーディングはプラットフォームに依存します.locale.getpreferredencoding(False) を使うと,ロケールのエンコーディングを得ることができます(プログラム例).

Python のエンコーディング (英語と日本語)
コーデック 別名 言語
ascii646, us-ascii英語
cp037IBM037, IBM039英語
cp437437, IBM437英語
cp932932, ms932, mskanji, ms-kanji日本語
euc_jpeucjp, ujis, u-jis日本語
euc_jis_2004jisx0213, eucjis2004日本語
euc_jisx0213eucjisx0213日本語
iso2022_jpcsiso2022jp, iso2022jp, iso-2022-jp日本語
iso2022_jp_1iso2022jp-1, iso-2022-jp-1日本語
iso2022_jp_2iso2022jp-2, iso-2022-jp-2日本語, その他
iso2022_jp_2004iso2022jp-2004, iso-2022-jp-2004日本語
iso2022_jp_3iso2022jp-3, iso-2022-jp-3日本語
iso2022_jp_extiso2022jp-ext, iso-2022-jp-ext日本語
shift_jiscsshiftjis, shiftjis, sjis, s_jis日本語
shift_jis_2004shiftjis2004, sjis_2004, sjis2004日本語
shift_jisx0213shiftjisx0213, sjisx0213, s_jisx0213日本語
utf_32U32, utf32全ての言語
utf_32_beUTF-32BE全ての言語
utf_32_leUTF-32LE全ての言語
utf_16U16, utf16全ての言語
utf_16_beUTF-16BE全ての言語
utf_16_leUTF-16LE全ての言語
utf_7U7, unicode-1-1-utf-7全ての言語
utf_8U8, UTF, utf8全ての言語
utf_8_sig 全ての言語

ファイルオブジェクトに対するメソッド

ファイルの状態

ファイルオブジェクトのメソッドと変数
メソッド 動作
f.close()ファイルをクローズする.さらに,f.closed を True にする.
f.closedファイルがクローズ状態の時,True になる.
f.encodingファイルのエンコーディング.None の場合はデフォルト.
f.fileno()ファイディスクリプター(整数値)を返す.
f.flush()バッファーのデータを,強制的にファイルに書き込む.
f.isatty
f.mode
f.name
f.newlines
f.__next__()
f.peek(n)
f.read(n)
f.readable()
f.readinto(b)
f.readline(n)ファイルから 1 行読み取り,それを返す.ファイルの終端になれば,空の文字列を返す.
f.readlines(n)ファイルを全て読み込み,行が要素となったリストを返す.
f.seek(offset, from_what)読み書きポイントを変更します.from_what で基準点を設定します.from_what=0(デフォルト): ファイル先頭,1: 現在位置,2: ファイル終端.offset はポイントの変更文字数です.(例: f.seek(0, 0) は先頭へポイントを移動)
f.seekable()
f.tell()
f.truncate(size)
f.writable()
f.write(s)
f.writelines(seq)

ページ作成情報

参考資料

  1. open 関数に関しては,Python 3.4.2 ドキュメント組み込み関数 open()を参考にしました.

更新履歴

2014年12月13日 ページの新規作成


no counter