Python ファイルI/O

この章では基本的なI/O関数についてのみ説明します。その他の関数はPython標準ドキュメントを参照してください。

画面への出力

最も簡単な出力方法はprint文を使うことです。print文には、カンマで区切った0個以上の式を渡せます。この関数は渡された式を文字列式に変換し、結果を標準出力に書き出します。例は次のとおりです。

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

print "Python 是一个非常棒的语言,不是吗?"

標準画面には以下の結果が表示されます:

Python 是一个非常棒的语言,不是吗?

キーボード入力の読み取り

Pythonには標準入力から1行のテキストを読み取るための組み込み関数が2つあります。デフォルトの標準入力はキーボードです。次のとおりです。

  • raw_input
  • input

raw_input関数

raw_input([prompt]) 関数は標準入力から1行を読み取り、文字列を返します(末尾の改行は削除されます):

#!/usr/bin/python
# -*- coding: UTF-8 -*- 
 
str = raw_input("请输入:")
print "你输入的内容是: ", str

これにより任意の文字列の入力を求められ、同じ文字列が画面に表示されます。"Hello Python!" と入力すると、出力は次のようになります。

请输入:Hello Python!
你输入的内容是:  Hello Python!

input関数

input([prompt])関数とraw_input([prompt])関数は基本的に似ていますが、input はPython式を入力として受け取り、その演算結果を返します。

#!/usr/bin/python
# -*- coding: UTF-8 -*- 
 
str = input("请输入:")
print "你输入的内容是: ", str

これは入力に対応する次のような結果を生成します:

请输入:[x*5 for x in range(2,10,2)]
你输入的内容是:  [10, 20, 30, 40]

ファイルを開く・閉じる

これで標準入力と標準出力に対して読み書きができるようになりました。次に、実際のデータファイルを読み書きする方法を見ていきましょう。

Python は、デフォルトでのファイル基本操作に必要な関数とメソッドを提供しています。次を使用できます。fileオブジェクトで大半のファイル操作を行えます。

open関数

まずPython組み込みのopen()関数を使ってファイルを開き、fileオブジェクトを作成する必要があります。そうすることで、関連するメソッドがそのファイルを呼び出して読み書きできるようになります。

構文:

file object = open(file_name [, access_mode][, buffering])

各パラメータの詳細は次のとおりです:

  • file_name:file_name変数は、アクセスしたいファイル名を含む文字列値です。
  • access_mode:access_modeはファイルを開くモード(読み取り専用、書き込み、追記など)を決定します。取り得る値は以下の完全なリストを参照してください。このパラメータは必須ではなく、デフォルトのファイルアクセスモードは読み取り専用(r)です。
  • buffering:bufferingの値が0に設定されると、バッファリングは行われません。bufferingの値が1の場合、ファイルアクセス時に行単位でバッファリングされます。bufferingの値が1より大きい整数に設定された場合、それはバッファ領域のバッファサイズを示します。負の値が指定された場合、バッファ領域のサイズはシステムデフォルトになります。

ファイルを開くさまざまなモードの完全なリスト:

モード説明
tテキストモード(デフォルト)。
x書き込みモード。新しいファイルを作成します。ファイルが既に存在する場合はエラーになります。
bバイナリモード。
+ファイルを更新(読み取り・書き込み可能)用に開きます。
Uユニバーサル改行モード(推奨されません)。
r読み取り専用でファイルを開きます。ファイルポインタはファイルの先頭に置かれます。これがデフォルトモードです。
rbバイナリ形式で読み取り専用用にファイルを開きます。ファイルポインタはファイルの先頭に置かれます。これはデフォルトモードです。通常、画像などのテキスト以外のファイルに使用します。
r+読み書き用にファイルを開きます。ファイルポインタはファイルの先頭に置かれます。
rb+バイナリ形式で読み書き用にファイルを開きます。ファイルポインタはファイルの先頭に置かれます。通常、画像などのテキスト以外のファイルに使用します。
w書き込み専用でファイルを開きます。ファイルが既に存在する場合はファイルを開き、先頭から編集を開始します。つまり既存の内容は削除されます。ファイルが存在しない場合は、新しいファイルを作成します。
wbバイナリ形式で書き込み専用用にファイルを開きます。ファイルが既に存在する場合はファイルを開き、先頭から編集を開始します。つまり既存の内容は削除されます。ファイルが存在しない場合は、新しいファイルを作成します。通常、画像などのテキスト以外のファイルに使用します。
w+読み書き用にファイルを開きます。ファイルが既に存在する場合はファイルを開き、先頭から編集を開始します。つまり既存の内容は削除されます。ファイルが存在しない場合は、新しいファイルを作成します。
wb+バイナリ形式で読み書き用にファイルを開きます。ファイルが既に存在する場合はファイルを開き、先頭から編集を開始します。つまり既存の内容は削除されます。ファイルが存在しない場合は、新しいファイルを作成します。通常、画像などのテキスト以外のファイルに使用します。
a追記用にファイルを開きます。ファイルが既に存在する場合、ファイルポインタはファイルの末尾に置かれます。つまり、新しい内容は既存の内容の後に書き込まれます。ファイルが存在しない場合は、書き込み用の新しいファイルを作成します。
abバイナリ形式で追記用にファイルを開きます。ファイルが既に存在する場合、ファイルポインタはファイルの末尾に置かれます。つまり、新しい内容は既存の内容の後に書き込まれます。ファイルが存在しない場合は、書き込み用の新しいファイルを作成します。
a+読み書き用にファイルを開きます。ファイルが既に存在する場合、ファイルポインタはファイルの末尾に置かれます。ファイルは追記モードで開かれます。ファイルが存在しない場合は、読み書き用の新しいファイルを作成します。
ab+バイナリ形式で追記用にファイルを開きます。ファイルが既に存在する場合、ファイルポインタはファイルの末尾に置かれます。ファイルが存在しない場合は、読み書き用の新しいファイルを作成します。

次の図はこれらのモードをうまくまとめています:

モード r r+ w w+ a a+
读 + + + +
写 + + + + +
作成 + + + +
上書き + +
ポインタは先頭 + + + +
ポインタは末尾 + +

Fileオブジェクトの属性

ファイルを開くと、fileオブジェクトが得られ、そのファイルに関するさまざまな情報を取得できます。

以下はfileオブジェクトに関連するすべての属性のリストです:

属性説明
file.closedファイルが閉じられている場合はtrueを返し、それ以外の場合はfalseを返します。
file.mode開かれたファイルのアクセスモードを返します。
file.nameファイルの名前を返します。
file.softspaceprintで出力した後にスペース文字を続ける必要がある場合はfalseを返します。それ以外の場合はtrueを返します。

以下の例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 打开一个文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
print "是否已关闭 : ", fo.closed
print "访问模式 : ", fo.mode
print "末尾是否强制加空格 : ", fo.softspace

上記の例の出力結果:

文件名:  foo.txt
是否已关闭 :  False
访问模式 :  w
末尾是否强制加空格 :  0

close()メソッド

File オブジェクトの close() メソッドは、バッファ内のまだ書き込まれていない情報をすべてフラッシュし、そのファイルを閉じます。これ以降、書き込みはできなくなります。

ファイルオブジェクトの参照が別のファイルに再指定されると、Python は以前のファイルを閉じます。close() メソッドでファイルを閉じることは良い習慣です。

構文:

fileObject.close()

例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 打开一个文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
 
# 关闭打开的文件
fo.close()

上記の例の出力結果:

文件名:  foo.txt

ファイルの読み書き:

fileオブジェクトは、ファイルアクセスをより簡単にする一連のメソッドを提供します。read()メソッドとwrite()メソッドを使ってファイルを読み書きする方法を見ていきましょう。

write()メソッド

write()メソッドは、任意の文字列を開いているファイルに書き込むことができます。重要な点として、Pythonの文字列は単なるテキストだけでなくバイナリデータにもなり得ます。

write()メソッドは文字列の末尾に改行文字('\n')を追加しません:

構文:

fileObject.write(string)

ここで渡されるパラメータは、開いているファイルに書き込む内容です。

例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 打开一个文件
fo = open("foo.txt", "w")
fo.write( "www.example.com!\nVery good site!\n")
 
# 关闭打开的文件
fo.close()

上記のメソッドは foo.txt ファイルを作成し、受け取った内容をそのファイルに書き込み、最後にファイルを閉じます。このファイルを開くと、次の内容が表示されます:

$ cat foo.txt 
www.example.com!
Very good site!

read()メソッド

read() メソッドは、開いているファイルから文字列を読み取ります。重要な点として、Pythonの文字列は単なるテキストだけでなくバイナリデータにもなり得ます。

構文:

fileObject.read([count])

ここで渡されるパラメータは、開いているファイルから読み取るバイト数です。このメソッドはファイルの先頭から読み込みを開始します。countが渡されない場合は、できるだけ多く読み取ろうとし、おそらくファイルの末尾まで読み取ります。

例:

ここでは、上で作成した foo.txt ファイルを使用します。

例

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# ファイルを開く
fo = open("foo.txt", "r+")
str = fo.read(10)
print "読み取った文字列は : ", str
# 開いたファイルを閉じる
fo.close()

上記の例の出力結果:

读取的字符串是 :  www.サンプル

ファイルの位置指定

tell()メソッドは、ファイル内の現在位置を教えてくれます。言い換えると、次の読み書きはファイルの先頭からそのバイト数だけ進んだ位置で行われます。

seek(offset [,from]) メソッドは、現在のファイル位置を変更します。Offset変数は移動するバイト数を表します。From変数は、バイトの移動を開始する基準位置を指定します。

fromが0に設定された場合、ファイルの先頭が移動バイトの基準位置として扱われることを意味します。1に設定された場合は、現在の位置が基準位置として使用されます。2に設定された場合は、ファイルの末尾が基準位置となります。

例:

上記で作成したファイルfoo.txtを使用します。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 打开一个文件
fo = open("foo.txt", "r+")
str = fo.read(10)
print "读取的字符串是 : ", str
 
# 查找当前位置
position = fo.tell()
print "当前文件位置 : ", position
 
# 把指针再次重新定位到文件开头
position = fo.seek(0, 0)
str = fo.read(10)
print "重新读取字符串 : ", str
# 关闭打开的文件
fo.close()

上記の例の出力結果:

读取的字符串是 :  www.サンプル
当前文件位置 :  10
重新读取字符串 :  www.サンプル

ファイルの名前変更と削除

Pythonのosモジュールは、ファイル名の変更やファイルの削除など、ファイル処理操作を支援するメソッドを提供します。

このモジュールを使用するには、最初にインポートしてから、関連するさまざまな機能を呼び出す必要があります。

rename() メソッド

rename() メソッドは、現在のファイル名と新しいファイル名の2つのパラメータを必要とします。

構文:

os.rename(current_file_name, new_file_name)

例:

次の例では、既存のファイルtest1.txtの名前を変更します。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
 
# 重命名文件test1.txt到test2.txt。
os.rename( "test1.txt", "test2.txt" )

remove() メソッド

remove()メソッドを使用してファイルを削除できます。削除するファイル名をパラメータとして指定する必要があります。

構文:

os.remove(file_name)

例:

次の例では、既存のファイルtest2.txtを削除します。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
 
# 删除一个已经存在的文件test2.txt
os.remove("test2.txt")

Pythonでのディレクトリ:

すべてのファイルはさまざまなディレクトリに含まれていますが、Pythonでも簡単に処理できます。osモジュールには、ディレクトリの作成、削除、変更に役立つ多くのメソッドがあります。

mkdir() メソッド

osモジュールのmkdir()メソッドを使用して、現在のディレクトリに新しいディレクトリを作成できます。作成するディレクトリの名前を含むパラメータを指定する必要があります。

構文:

os.mkdir("newdir")

例:

次の例では、現在のディレクトリに新しいディレクトリtestを作成します。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
 
# 创建目录test
os.mkdir("test")

chdir() メソッド

chdir()メソッドを使用して、現在のディレクトリを変更できます。chdir()メソッドが必要とするパラメータは、現在のディレクトリに設定したいディレクトリ名です。

構文:

os.chdir("newdir")

例:

次の例では、"/home/newdir"ディレクトリに移動します。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
 
# 将当前目录改为"/home/newdir"
os.chdir("/home/newdir")

getcwd() メソッド

getcwd()メソッドは、現在の作業ディレクトリを表示します。

構文:

os.getcwd()

例:

次の例では、現在のディレクトリを返します:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
 
# 给出当前的目录
print os.getcwd()

rmdir() メソッド

rmdir()メソッドはディレクトリを削除します。ディレクトリ名はパラメータとして渡されます。

このディレクトリを削除する前に、その中のすべての内容を先にクリアしておく必要があります。

構文:

os.rmdir('dirname')

例:

以下は、"/tmp/test"ディレクトリを削除する例です。ディレクトリの完全な正しい名前を指定する必要があります。そうしないと、現在のディレクトリ内でそのディレクトリが検索されます。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
 
# 删除”/tmp/test”目录
os.rmdir( "/tmp/test"  )

ファイル・ディレクトリ関連メソッド

FileオブジェクトとOSオブジェクトは、ファイルとディレクトリの多くの操作メソッドを提供します。以下のリンクをクリックして詳細を確認できます:

その他の拡張