open【ファイルオープン】3.3・3.4・3.5・3.6

メモ 外部リンク 構文 例 ( テキストファイル バイナリファイル エラー処理 ユニバーサル改行モード オープナー )
ファイル操作テキストファイル バイナリファイル

メモ


構文

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener3.3 =None)

戻り値ファイルオブジェクト 〔ファイル操作fileファイルパス (下記の指定が可能)
パス文字列(絶対パス・相対パス)・パス形式オブジェクト3.6 ・ファイル記述子(整数値)
modeモード (デフォルト:'r' テキスト読み込み)〔テキストファイルの例バイナリファイルの例bufferingバッファリング
0無効 (バイナリモードのみ)
1行単位バッファリング (テキストモードのみ)
省略・その他open() を参照
encodingテキストモードのエンコーディング (省略:プラットフォーム依存)
errorsテキストモードのエラー処理
newlineテキストモードのユニバーサル改行モード
closefdファイル記述子指定時のクローズ処理
True戻り値のファイルオブジェクトがクローズされると、ファイル記述子もクローズ
False戻り値のファイルオブジェクトがクローズされても、ファイル記述子はクローズなし
opener3.3オープナー

例外
ValueError指定値の不正 (modeの組合せ不正 等)
OSError3.3ファイルオープン不可 (以前は IOError)
FileExistsError既存ファイルを 'x'【排他的作成】 モードでオープン 3.3
戻り値
モード 等戻り値
テキスト io.TextIOWrapper
バイナリ buffering:無効
(その他モードは任意)
io.FileIO
'+' を含む io.BufferedRandom
'w'
'a'
'x'
io.BufferedWriter
'r' io.BufferedReader
modeモード (順不同で以下の組み合せ、通常は上から指定)
モード説明備考
'r' (デフォルト) 読み込み 択一
省略:'r'
他と組み合せる場合、必須
'w'書き込み (上書き)
'x' 3.3 排他的作成
(既存ファイルは FileExistsErro 例外)
'a'書き込み (追記)
'+'更新 (読み込み・書き込み)任意
'b'バイナリ択一
省略:'t'
't' (デフォルト)テキスト
'U' 3.33.9ユニバーサル改行モード
encoding ( 一部抜粋、その他は codecs 参照)
エンコーディング別名備考
省略
None
プラットフォーム依存
ascii646
us-ascii
ASCII
cp932932
ms932
mskanji
ms-kanji
コードページ 932
euc_jpeuc-jp
eucjp
ujis
u-jis
日本語EUC
shift_jisshift-jis
csshiftjis
shiftjis
sjis
s_jis
Shift_JIS
utf_7utf-7
U7
unicode-1-1-utf-7
UTF-7
utf_8utf-8
U8
UTF
utf8
UTF-8
utf_16utf-16
U16
utf16
UTF-16
utf_32utf-32
U32
utf32
UTF-32
errorsエラー処理〔
エラー処理名エラー処理
None (デフォルト)
'strict'
ValueError 例外
'ignore'エラー無視 (データ欠落の可能性あり)
'replace'不正データ位置に置換マーカー('?' 等)挿入
'surrogateescape'読み込み:コードポイント(U+DC80 ~ U+DCFF)に置換
書き込み:コードポイントは元に変換
'xmlcharrefreplace'書き込みのみサポート
エラー文字を文字参照(&#nnn;)に置換
'backslashreplace'エスケープシーケンスで置換
'namereplace' 3.5書き込みのみサポート
エラー文字を \N{~} に置換
その他codecs.register_error() で登録されたエラー処理
newlineユニバーサル改行モード〔
指定値読み込み書き込み
None 改行は '\n' に変換 '\n' はシステムの改行コード (os.linesep) に変換
''改行コードは全て改行とみなす (変換なし) '\n' は変換なし
'\n' 指定値のみ改行とみなす (変換なし)
'\r' '\n' は指定値に変換
'\r\n'
openerオープナーの仕様〔
引数 (例)備考
fileファイルパス (file)
flags os.open() のオープンフラグ
戻り値備考
ファイル記述子整数値

テキストファイル の例

import os  # remove() 用

FILE_TEXT = "data/test-open.txt"
fw = open(FILE_TEXT, "w")
print(type(fw))
# 出力:<class '_io.TextIOWrapper'>

lst = [
    "Line 1\n",
    "Line 2\n",
]
fw.writelines(lst)
print(fw.closed)
# 出力:False
fw.close()
print(fw.closed)
# 出力:True

with open(FILE_TEXT, "a") as fa:
    print("Line 3", file=fa)
    fa.write("Line 4")
print(fa.closed)
# 出力:True

with open(FILE_TEXT, "r+") as frp:
    s = frp.readline()
    print(s)
    frp.write("EOF")
# 出力:Line 1
# 出力:

with open(FILE_TEXT, "r") as fr:
    for s in fr:
        print(s)
# 出力:Line 1
# 出力:
# 出力:Line 2
# 出力:
# 出力:Line 3
# 出力:
# 出力:Line 4EOF

with open(FILE_TEXT, "r") as fr:
    s = fr.read()
    print(s)
# 出力:Line 1
# 出力:Line 2
# 出力:Line 3
# 出力:Line 4EOF

with open(FILE_TEXT, "r") as fr:
    lst = fr.readlines()
print(lst)
# 出力:['Line 1\n', 'Line 2\n', 'Line 3\n', 'Line 4EOF']

try:
    with open(FILE_TEXT, "x") as fx:
        pass
except FileExistsError as e:
    print(type(e))
# 出力:<class 'FileExistsError'>

os.remove(FILE_TEXT)
with open(FILE_TEXT, "x") as fx:
    fx.write("ABC")
with open(FILE_TEXT, "r") as fr:
    s = fr.read()
    print(s)
# 出力:ABC

バイナリファイル の例

import io  # seek() 用
import os  # remove() 用

FILE_BIN = "data/test-open.bin"
fwb = open(FILE_BIN, "wb")
print(type(fwb))
# 出力:<class '_io.BufferedWriter'>

fwb.write(b"abc")
print(fwb.closed)
# 出力:False
fwb.close()
print(fwb.closed)
# 出力:True

with open(FILE_BIN, "ab") as fab:
    fab.write(b"DEFGHI")
print(fab.closed)
# 出力:True

with open(FILE_BIN, "r+b") as frpb:
    print(type(frpb))
    # 出力:<class '_io.BufferedRandom'>
    b = frpb.read()
    print(b)
    # 出力:b'abcDEFGHI'
    frpb.seek(-3, io.SEEK_END)
    b = frpb.peek(3)
    print(b)
    # 出力:b'GHI'
    frpb.write(b"EOF")

with open(FILE_BIN, "rb") as frb:
    print(type(frb))
    # 出力:<class '_io.BufferedReader'>
    b = frb.read()
    print(b)
    # 出力:b'abcDEFEOF'

try:
    with open(FILE_BIN, "xb") as fxb:
        pass
except FileExistsError as e:
    print(type(e))
# 出力:<class 'FileExistsError'>

os.remove(FILE_BIN)
with open(FILE_BIN, "xb") as fxb:
    fxb.write(b"ABC")
with open(FILE_BIN, "rb") as frb:
    b = frb.read()
    print(b)
# 出力:b'ABC'

errorsの指定例

FILE_IN = "data/test-open.in"
FILE_OUT = "data/test-open.out"
DATA = "ABCあいうXYZ"

# テストファイル
print("テストファイル")
with open(FILE_IN, "w", encoding="utf-8") as f:
    f.write(DATA)
with open(FILE_IN, "r", encoding="utf-8") as f:
    for line in f:
        print(list(line))
# 出力:['A', 'B', 'C', 'あ', 'い', 'う', 'X', 'Y', 'Z']
with open(FILE_IN, "rb") as f:
    print(bytes(f.read()))
# 出力:b'ABC\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86XYZ'

print("\nerrors='None'")
with open(FILE_IN, "r", encoding="ascii") as f:
    try:
        for line in f:
            print(list(line))
    except ValueError as e:
        print("ValueError:", type(e), e)
# 出力:ValueError: <class 'UnicodeDecodeError'> 'ascii' codec can't decode byte 0xe3 in position 3: ordinal not in range(128)

with open(FILE_OUT, "w", encoding="ascii") as f:
    try:
        f.write(DATA)
    except ValueError as e:
        print("ValueError:", type(e), e)
# 出力:ValueError: <class 'UnicodeEncodeError'> 'ascii' codec can't encode characters in position 3-5: ordinal not in range(128)

print("\nerrors='strict'")
with open(FILE_IN, "r", encoding="ascii", errors="strict") as f:
    try:
        for line in f:
            print(list(line))
    except ValueError as e:
        print("ValueError:", type(e), e)
# 出力:ValueError: <class 'UnicodeDecodeError'> 'ascii' codec can't decode byte 0xe3 in position 3: ordinal not in range(128)

with open(FILE_OUT, "w", encoding="ascii", errors="strict") as f:
    try:
        f.write(DATA)
    except ValueError as e:
        print("ValueError:", type(e), e)
# 出力:ValueError: <class 'UnicodeEncodeError'> 'ascii' codec can't encode characters in position 3-5: ordinal not in range(128)

print("\nerrors='ignore'")
with open(FILE_IN, "r", encoding="ascii", errors="ignore") as f:
    for line in f:
        print(list(line))
# 出力:['A', 'B', 'C', 'X', 'Y', 'Z']

with open(FILE_OUT, "w", encoding="ascii", errors="ignore") as f:
    f.write(DATA)

with open(FILE_OUT, "r", encoding="utf-8") as f:
    for line in f:
        print(list(line))
# 出力:['A', 'B', 'C', 'X', 'Y', 'Z']

print("\nerrors='replace'")
with open(FILE_IN, "r", encoding="ascii", errors="replace") as f:
    for line in f:
        print(list(line))
# 出力:['A', 'B', 'C', '�', '�', '�', '�', '�', '�', '�', '�', '�', 'X', 'Y', 'Z']

with open(FILE_OUT, "w", encoding="ascii", errors="replace") as f:
    f.write(DATA)
with open(FILE_OUT, "r", encoding="utf-8") as f:
    for line in f:
        print(list(line))
# 出力:['A', 'B', 'C', '?', '?', '?', 'X', 'Y', 'Z']

print("\nerrors='surrogateescape'")
with open(FILE_IN, "r", encoding="ascii", errors="surrogateescape") as fr, \
     open(FILE_OUT, "w", encoding="ascii", errors="surrogateescape") as fw:
    for line in fr:
        print(list(line))
        fw.write(line)
# 出力:['A', 'B', 'C', '\udce3', '\udc81', '\udc82', '\udce3', '\udc81', '\udc84', '\udce3', '\udc81', '\udc86', 'X', 'Y', 'Z']

with open(FILE_OUT, "r", encoding="utf-8") as f:
    for line in f:
        print(list(line))
# 出力:['A', 'B', 'C', 'あ', 'い', 'う', 'X', 'Y', 'Z']

print("\nerrors='xmlcharrefreplace' (write)")
with open(FILE_OUT, "w", encoding="ascii", errors="xmlcharrefreplace") as f:
    f.write(DATA)
with open(FILE_OUT, "r", encoding="utf-8") as f:
    for line in f:
        print(list(line))
# 出力:['A', 'B', 'C', '&', '#', '1', '2', '3', '5', '4', ';', '&', '#', '1', '2', '3', '5', '6', ';', '&', '#', '1', '2', '3', '5', '8', ';', 'X', 'Y', 'Z']

print("\nerrors='backslashreplace'")
with open(FILE_IN, "r", encoding="ascii", errors="backslashreplace") as f:
    for line in f:
        print(list(line))
# 出力:['A', 'B', 'C', '\\', 'x', 'e', '3', '\\', 'x', '8', '1', '\\', 'x', '8', '2', '\\', 'x', 'e', '3', '\\', 'x', '8', '1', '\\', 'x', '8', '4', '\\', 'x', 'e', '3', '\\', 'x', '8', '1', '\\', 'x', '8', '6', 'X', 'Y', 'Z']

with open(FILE_OUT, "w", encoding="ascii", errors="backslashreplace") as f:
    f.write(DATA)
with open(FILE_OUT, "r", encoding="utf-8") as f:
    for line in f:
        print(list(line))
# 出力:['A', 'B', 'C', '\\', 'u', '3', '0', '4', '2', '\\', 'u', '3', '0', '4', '4', '\\', 'u', '3', '0', '4', '6', 'X', 'Y', 'Z']

print("\nerrors='namereplace' (write)")
with open(FILE_OUT, "w", encoding="ascii", errors="namereplace") as f:
    f.write(DATA)
with open(FILE_OUT, "r", encoding="utf-8") as f:
    for line in f:
        print(list(line))
# 出力:['A', 'B', 'C', '\\', 'N', '{', 'H', 'I', 'R', 'A', 'G', 'A', 'N', 'A', ' ', 'L', 'E', 'T', 'T', 'E', 'R', ' ', 'A', '}', '\\', 'N', '{', 'H', 'I', 'R', 'A', 'G', 'A', 'N', 'A', ' ', 'L', 'E', 'T', 'T', 'E', 'R', ' ', 'I', '}', '\\', 'N', '{', 'H', 'I', 'R', 'A', 'G', 'A', 'N', 'A', ' ', 'L', 'E', 'T', 'T', 'E', 'R', ' ', 'U', '}', 'X', 'Y', 'Z']

newlineの指定例

# newline の動作 (Windows)
FILE_IN = "data/test-open.in"
FILE_OUT = "data/test-open.out"

def read_file(newline):
    with open(FILE_IN, "r", newline=newline) as f:
        for line in f:
            print(list(line))
    print()


def write_file(newline):
    with open(FILE_OUT, "w", newline=newline) as out, \
        open(FILE_IN, "r", newline=None) as f:
        for line in f:
            out.write(line)
    with open(FILE_OUT, "r", newline="") as f:
        for line in f:
            print(list(line))
    print()


# テストファイル
with open(FILE_IN, "w", newline="") as f:
    f.write("N\n")
    f.write("R\r")
    f.write("RN\r\n")
    f.write("EOF")
print("テストファイル")
read_file("")
# 出力:['N', '\n']
# 出力:['R', '\r']
# 出力:['R', 'N', '\r', '\n']
# 出力:['E', 'O', 'F']

print("newline=None")
read_file(None)
# 出力:['N', '\n']
# 出力:['R', '\n']
# 出力:['R', 'N', '\n']
# 出力:['E', 'O', 'F']
write_file(None)
# 出力:['N', '\r', '\n']
# 出力:['R', '\r', '\n']
# 出力:['R', 'N', '\r', '\n']
# 出力:['E', 'O', 'F']

print("newline=''")
read_file("")
# 出力:['N', '\n']
# 出力:['R', '\r']
# 出力:['R', 'N', '\r', '\n']
# 出力:['E', 'O', 'F']
write_file("")
# 出力:['N', '\n']
# 出力:['R', '\n']
# 出力:['R', 'N', '\n']
# 出力:['E', 'O', 'F']

print("newline='\\n'")
read_file("\n")
# 出力:['N', '\n']
# 出力:['R', '\r', 'R', 'N', '\r', '\n']
# 出力:['E', 'O', 'F']
write_file("\n")
# 出力:['N', '\n']
# 出力:['R', '\n']
# 出力:['R', 'N', '\n']
# 出力:['E', 'O', 'F']

print("newline='\\r'")
read_file("\r")
# 出力:['N', '\n', 'R', '\r']
# 出力:['R', 'N', '\r']
# 出力:['\n', 'E', 'O', 'F']
write_file("\r")
# 出力:['N', '\r']
# 出力:['R', '\r']
# 出力:['R', 'N', '\r']
# 出力:['E', 'O', 'F']

print("newline='\\r\\n'")
read_file("\r\n")
# 出力:['N', '\n', 'R', '\r', 'R', 'N', '\r', '\n']
# 出力:['E', 'O', 'F']
write_file("\r\n")
# 出力:['N', '\r', '\n']
# 出力:['R', '\r', '\n']
# 出力:['R', 'N', '\r', '\n']
# 出力:['E', 'O', 'F']

openerの指定例

import os

def opener(file, flags):
    print(f"{file=} {flags=:#x}")
    print("size=", os.path.getsize(file))
    # 各種処理
    fd = os.open(file, flags)
    print(f"{fd=}")
    return fd


FILE = "data/test-open.txt"
with open(FILE, "w") as f:
    f.write("Test")
with open(FILE, opener=opener) as f:
    s = f.read()
    print(s)
# 出力:file='data/test-open.txt' flags=0x8080
# 出力:size= 4
# 出力:fd=3
# 出力:Test