Pythonファイルデータの読み書きの具体的な実現
ファイルデータの読み書き
ファイルを読み書きするということは、本質的にはオペレーティングシステムにファイルオブジェクトを開くように要求し、オペレーティングシステムが提供するインターフェースを介してこのファイルオブジェクトからデータ(ファイルを読む)を読み出したり、このファイルオブジェクト(ファイルを書く)にデータを書き込みます。
ファイル読み込み
Pythonを使ってopen()関数を内蔵し、rtのモードでファイルを読み込む例を示します。
バイナリファイル
バイナリのファイルを読み込むには、rbのモードで開く必要があります。
圧縮ファイル
gzipとbz 2フォーマットの圧縮ファイルを読み込む場合は、gzipとbz 2モジュールが使用できます。両方のモジュールは、gzipとbzの2つのフォーマットの圧縮ファイルを読み取るための別の実装を提供しています。例えば圧縮ファイルを読み込みます。例は以下の通りです。
ファイル書込みは、同様にopen()パラメータを呼び出す必要がありますが、指定されたモードはwtまたはwbで、テキストファイルまたはバイナリファイルを書くことを表します。
同様に圧縮データを書き込む場合は、gzipまたはbz 2モジュールを導入します。
wモードのopen()関数を使って、開いたファイルが書き込み前にデータの内容があると上書きされます。既存のファイルに内容を追加する場合は、モードはatのopen関数です。
文書を読み書きするモードの定義と意味に関しては、以下の通りです。
モード
意味
'r
データの読み込み(標準)
'w
データを書き込み
'x
ファイルに異常があります。存在しないなら作成します。
'a'
書込みデータの追加
'b
バイナリモード
‘t’
テキストモード(標準)
'+'
ファイルの更新(読み書き)
より詳細な内容はPython公式文書を参照することができる。
参考資料
ソース
David M.BeazleyBrian K.Jones.Python Cookbook,3 rd Edtions.O'Reilly Media.013.
Luciano Ramalho.Flouent Python.O'Reilly Media.015.
"2.Buil-in Functions".docs.python.org.Retrieved 20 Januar 2020.
「gzip-Support forg zip files」.docs.python.org.Retrieved 22 Januar 2020.
「bz 2-Support for bzip 2 comppression」.docs.python.org.Retrieved 22 Januar 2020.
廖雪峰.「Python教程」.liaoxuefeng.com.[2020-01-18]
以上は本編の主な内容です。皆さんの勉強に役に立つように、私たちを応援してください。
ファイルを読み書きするということは、本質的にはオペレーティングシステムにファイルオブジェクトを開くように要求し、オペレーティングシステムが提供するインターフェースを介してこのファイルオブジェクトからデータ(ファイルを読む)を読み出したり、このファイルオブジェクト(ファイルを書く)にデータを書き込みます。
ファイル読み込み
Pythonを使ってopen()関数を内蔵し、rtのモードでファイルを読み込む例を示します。
>>> f = open('some.txt', 'rt')
この行のコードはファイルを開くという意味です。ファイルが存在しない場合は、IOErrの異常を抛り出し、詳細な情報を提示します。
>>> f = open('undefined.txt', 'rt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'undefined.txt'
ファイルを開けました。read()関数を使ってファイルの内容を読み取ることができます。
>>> f.read()
'Hello world!'
データの読み込みが完了すると、close()を呼び出してファイルを閉じる必要があります。ファイルオブジェクトはリソースを占有しますので、使用後は即時にリリースリソースをクローズする必要があります。
>>> f.close()
もう一つの方法はwith文を使って、使用されたファイルにコンテキスト環境を作成することで、ファイルオブジェクトは自動的に閉じられます。
>>> with open('some.txt', 'rt') as f:
... data = f.read()
...
read()を呼び出した場合は、一度に全ての内容を読み取ります。ファイルの内容が大きすぎると、read(size)を使ってサイズを固定して循環して読み取り、毎回最大sizeバイトの内容を読み取ります。readline()関数は、1行の内容を読むたびに、readlines()はすべての内容を読みますが、行ごとにlistに戻ります。三者の使用は実際の需要によって選択できます。バイナリファイル
バイナリのファイルを読み込むには、rbのモードで開く必要があります。
>>> f = open('image.jpg', 'rb')
>>> f.read()
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00...'
ファイルからデータを読み取るには、符号化の問題に注意が必要です。エンコーディングが間違っていると、Unicode DecodeErrが異常に投げ出されます。たとえば:
>>> f = open('some.txt', 'rt', encoding='ascii')
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.6/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 2: ordinal not in range(128)
この場合、通常はリードテキストに指定された符号化が正しくないため、ファイルの符号化が正しいかどうかを確認する必要があります。コードエラーがまだ存在する場合、オプン関数にオプションのerrorsパラメータを伝達してこれらのエラーを処理することができます。たとえば:
>>> f = open('some.txt', 'rt', encoding='ascii', errors='replace')
>>> f.read()
'Un��ic��o��de��'
>>> f = open('some.txt', 'rt', encoding='ascii', errors='ignore')
>>> f.read()
'Unicode'
パラメータerrorsを使って符号化エラーの問題を処理することができますが、プロセスは非常に悪いと思います。ここで提唱しているのは正しいコードを確保することです。あいまいな時はデフォルトの設定(通常はUTF-8)を使います。圧縮ファイル
gzipとbz 2フォーマットの圧縮ファイルを読み込む場合は、gzipとbz 2モジュールが使用できます。両方のモジュールは、gzipとbzの2つのフォーマットの圧縮ファイルを読み取るための別の実装を提供しています。例えば圧縮ファイルを読み込みます。例は以下の通りです。
>>> import gzip
>>> with gzip.open('some.gz', 'rt') as f:
... text=f.read()
>>> import bz2
>>> with bz2.open('some.bz2', 'rt') as f:
... text=f.read()
ファイル書き込みファイル書込みは、同様にopen()パラメータを呼び出す必要がありますが、指定されたモードはwtまたはwbで、テキストファイルまたはバイナリファイルを書くことを表します。
>>> f = open('some.txt', 'wt')
>>> f.write('Hello, world!')
13
>>> f.close()
データの書き込みが完了したら、close()を呼び出してファイルオブジェクトを閉じる必要があります。with文は、通常のファイルオブジェクトを閉じるためにコンテキストを作成することもできます。同様に圧縮データを書き込む場合は、gzipまたはbz 2モジュールを導入します。
>>> import gzip
>>> with gzip.open('some.gz', 'wt') as f:
... f.write(text)
>>> import bz2
>>> with bz2.open('some.bz2', 'wt') as f:
... f.write(text)
圧縮データを書き込む場合は、任意のパラメータcomplevelで圧縮レベルを指定できます。たとえば:
>>> with gzip.open('some.gz', 'wt', compresslevel=6) as f:
... f.write(text)
copresslevelパラメータのデフォルト値は9で、最高の圧縮レベルを表します。レベルが低いほど性能は良いですが、圧縮度は低いです。wモードのopen()関数を使って、開いたファイルが書き込み前にデータの内容があると上書きされます。既存のファイルに内容を追加する場合は、モードはatのopen関数です。
文書を読み書きするモードの定義と意味に関しては、以下の通りです。
モード
意味
'r
データの読み込み(標準)
'w
データを書き込み
'x
ファイルに異常があります。存在しないなら作成します。
'a'
書込みデータの追加
'b
バイナリモード
‘t’
テキストモード(標準)
'+'
ファイルの更新(読み書き)
より詳細な内容はPython公式文書を参照することができる。
参考資料
ソース
David M.BeazleyBrian K.Jones.Python Cookbook,3 rd Edtions.O'Reilly Media.013.
Luciano Ramalho.Flouent Python.O'Reilly Media.015.
"2.Buil-in Functions".docs.python.org.Retrieved 20 Januar 2020.
「gzip-Support forg zip files」.docs.python.org.Retrieved 22 Januar 2020.
「bz 2-Support for bzip 2 comppression」.docs.python.org.Retrieved 22 Januar 2020.
廖雪峰.「Python教程」.liaoxuefeng.com.[2020-01-18]
以上は本編の主な内容です。皆さんの勉強に役に立つように、私たちを応援してください。