Python学習ノート9-IOプログラミング

7265 ワード

ファイルの読み書き
ファイルの読み取りと書き込みは、オペレーティングシステムにファイルオブジェクト(通常はファイル記述子と呼ばれる)を開くように要求し、オペレーティングシステムが提供するインタフェースを介してこのファイルオブジェクトからデータ(ファイルの読み取り)を読み出したり、このファイルオブジェクト(ファイルの書き込み)にデータを書き込んだりすることです.
ファイルを読む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バイトのコンテンツ
  • を1回に最大読み出す.
  • 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関数はdictStudentインスタンスに変換する責任を負います.
    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))