Python学習ノート9-IOプログラミング
7265 ワード
ファイルの読み書き
ファイルの読み取りと書き込みは、オペレーティングシステムにファイルオブジェクト(通常はファイル記述子と呼ばれる)を開くように要求し、オペレーティングシステムが提供するインタフェースを介してこのファイルオブジェクトからデータ(ファイルの読み取り)を読み出したり、このファイルオブジェクト(ファイルの書き込み)にデータを書き込んだりすることです.
ファイルを読む
ラベル'r'は読み取りを表す
ファイルが存在しない場合、
ファイルを開くことに成功した場合、
最後にclose()メソッドを呼び出してファイルを閉じる
ファイルが正しく閉じられるようにするには、 を一括して読み取る. を1回に最大読み出す. を読み出す. に戻る.
file-like Object
file-like Objectは特定のクラスから継承する必要はありません.read()メソッドを書けばいいです.
文字コード
読み込みファイルのエンコードを指定します(デフォルトutf-8):
一部の符号化が規範化されていないファイルに遭遇すると、
最も簡単な方法は、直接無視することです.
バイナリファイル
バイナリファイルを読み込むには、
ファイルを書く
書き込みファイルが
ファイルを書くとき、オペレーティングシステムはすぐにデータをディスクに書き込むのではなく、メモリをキャッシュし、暇なときにゆっくり書き込むことが多い.close()メソッドを呼び出すと、オペレーティングシステムは書き込みされていないデータをすべてディスクに書き込むことを保証します.
StringIOとBytesiO
StringIO
strをStringIOに書き込む:
ファイルを読むようにStringIOを読み込みます.
BytesIO
操作ファイルとディレクトリ
Python内蔵の
操作ファイルとディレクトリ
操作ファイルとディレクトリの関数の一部は
Pythonの特性を利用してファイルをフィルタリングする
シーケンス化
Pythonは、シーケンス化を実現するための
dictをシーケンス化してファイルに書き込む:
逆シーケンス化:
JSON
Pythonに内蔵された
JSONステップアップ
classをシーケンス化
デフォルトでは、
dumps()メソッドはまた、パラメータ
通常classのインスタンスには
JSONを
ファイルの読み取りと書き込みは、オペレーティングシステムにファイルオブジェクト(通常はファイル記述子と呼ばれる)を開くように要求し、オペレーティングシステムが提供するインタフェースを介してこのファイルオブジェクトからデータ(ファイルの読み取り)を読み出したり、このファイルオブジェクト(ファイルの書き込み)にデータを書き込んだりすることです.
ファイルを読む
open()
関数ファイルオブジェクトを開くf = open('/Users/michael/test.txt', 'r')
ラベル'r'は読み取りを表す
ファイルが存在しない場合、
open()
関数はIOError
のエラーを放出します.ファイルを開くことに成功した場合、
read()
メソッドを呼び出してファイルのすべての内容を一度に読み取ることができ、Pythonはコンテンツをメモリに読み込み、strオブジェクトで表す.str1 = f.read()
最後にclose()メソッドを呼び出してファイルを閉じる
f.close()
ファイルが正しく閉じられるようにするには、
try ... finally
を使用します.try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
with
文は、close()
メソッドを自動的に呼び出します.with open('/path/to/file', 'r') as f:
print(f.read())
read()
は、ファイルの全内容read(size)
sizeバイトのコンテンツreadline()
は、1行分のコンテンツreadlines()
は、全てのコンテンツを一度に読み出し、行毎にlist file-like Object
open()
関数が返すようなread()
メソッドのあるオブジェクトは、Pythonではfile-like Objectと総称される.fileのほかに、メモリのバイトストリーム、ネットワークストリーム、カスタムストリームなどもあります.file-like Objectは特定のクラスから継承する必要はありません.read()メソッドを書けばいいです.
文字コード
読み込みファイルのエンコードを指定します(デフォルトutf-8):
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
一部の符号化が規範化されていないファイルに遭遇すると、
UnicodeDecodeError
に遭遇する可能性があります.テキストファイルに不正に符号化された文字が混在している可能性があります.open()
関数はまた、符号化エラーが発生した場合にどのように処理するかを示すerrors
パラメータを受信する.最も簡単な方法は、直接無視することです.
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
バイナリファイル
バイナリファイルを読み込むには、
'rb'
モードでファイルを開くといいです.f = open('/Users/michael/test.jpg', 'rb')
f.read()
ファイルを書く
書き込みファイルが
open()
関数を呼び出すと、入力識別子'w'
または'wb'
は、書き込みテキストファイルまたは書き込みバイナリファイルを表す.f = open('/Users/michael/test.txt', 'w')
f.write('Hello, world!')
f.close()
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
ファイルを書くとき、オペレーティングシステムはすぐにデータをディスクに書き込むのではなく、メモリをキャッシュし、暇なときにゆっくり書き込むことが多い.close()メソッドを呼び出すと、オペレーティングシステムは書き込みされていないデータをすべてディスクに書き込むことを保証します.
StringIOとBytesiO
StringIO
strをStringIOに書き込む:
from io import StringIO
# StringIO
f = StringIO()
#
f.write('hello')
# str
print(f.getvalue())
ファイルを読むようにStringIOを読み込みます.
from io import StringIO
f = StringIO('Hello!
Hi!
Goodbye!')
while True:
s = f.readline()
if s == '':
break
print(s.strip())
BytesIO
from io import BytesIO
f = BytesIO()
#
f.write(' '.encode('utf-8'))
print(f.getvalue())
from io import BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
f.read()
操作ファイルとディレクトリ
Python内蔵の
os
モジュールは、オペレーティングシステムが提供するインタフェース関数を直接呼び出すこともできます.import os
# , posix, Linux、Unix Mac OS X, nt, Windows
os.name
# , Windows
os.uname()
#
os.environ
#
os.environ.get('PATH')
os.environ.get('x', 'default')
操作ファイルとディレクトリ
操作ファイルとディレクトリの関数の一部は
os
モジュールに、一部はos.path
モジュールに配置されます.#
os.path.abspath('.') ==> 'C:\\Users\\lianwx'
#
os.listdir('.')
#
os.path.isdir('path')
#
os.path.isfile('path')
# 、 ,
# ,
os.path.join('C:\\Users\\lianwx', 'testdir')
#
os.path.split('/Users/michael/testdir/file.txt') ==> ('/Users/michael/testdir', 'file.txt')
#
os.path.splitext('/path/to/file.txt') ==> ('/path/to/file', '.txt')
#
os.mkdir('/Users/michael/testdir')
#
os.rmdir('/Users/michael/testdir')
#
os.rename('test.txt', 'test.py')
#
os.remove('test.py')
#
#
# `shutil` `copyfile()`
Pythonの特性を利用してファイルをフィルタリングする
#
[x for x in os.listdir('.') if os.path.isdir(x)]
# .py
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
シーケンス化
Pythonは、シーケンス化を実現するための
pickle
モジュールを提供しています.pickle.dumps()
メソッド任意のオブジェクトをbytesにシーケンス化pickle.dump()
直接オブジェクトをシーケンス化してfile-like Objectに書き込むdictをシーケンス化してファイルに書き込む:
import pickle
d = dict(name='Bob', age=20, score=88)
# bytes, , bytes
pickle.dumps(d)
f = open('dump.txt', 'wb')
# file-like Object
pickle.dump(d, f)
f.close()
逆シーケンス化:
pickle.loads()
メソッドbytesをオブジェクトに逆シーケンス化pickle.load()
メソッドは、1つのfile-like Objectからオブジェクトを直接逆シーケンス化するf = open('dump.txt', 'rb')
d = pickle.load(f)
f.close()
JSON
Pythonに内蔵された
json
モジュールは、非常に完全なPythonオブジェクトからJSONフォーマットへの変換を提供します.json.dumps()
メソッドはstrを返します.内容は標準のJSONです.json.dump()
メソッドはJSONを直接file-like Objectに書き込むことができますimport json
d = dict(name='Bob', age=20, score=88)
json.dumps(d)
json.loads()
メソッドJSONの文字列を逆シーケンス化json.load()
メソッドfile-like Objectから文字列を読み出して逆シーケンス化json_str = '{"age": 20, "score": 88, "name": "Bob"}'
json.loads(json_str)
JSONステップアップ
classをシーケンス化
デフォルトでは、
dumps()
メソッドでは、インスタンスをJSONの{}
オブジェクトに変更する方法がわかりません.dumps()メソッドはまた、パラメータ
default
が1つの関数を受け入れ、関数が1つのオブジェクトに伝達され、dictが変換関数として返される多くのオプションパラメータを提供する.通常classのインスタンスには
__dict__
のプロパティがあり、インスタンス変数を格納するためのdict
です.slotsを定義したclassなど、少数の例外もあります.import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
s = Student('Bob', 20, 88)
print(json.dumps(s, default=lambda obj: obj.__dict__))
JSONを
Student
オブジェクトインスタンスに逆シーケンス化し、loads()
メソッドはまずdict
オブジェクトを変換し、その後、私たちが入力したobject_hook
関数はdict
をStudent
インスタンスに変換する責任を負います.def dict2student(d):
return Student(d['name'], d['age'], d['score'])
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str, object_hook=dict2student))