Pythonのファイルの読み込みと書き込み、StringIOをとBytesIO

1 IOの意味

コンピュータにおいて、IOは、入力/出力速記、すなわち入力と出力されます。

データがメモリに常駐しているときに、プログラムが実行されているとされているので、これは、それがデータ交換に来るCPUコア超高速コンピューティング、通常、ディスク、ネットワークなどで行われ、私たちは、IOインタフェースを必要としています。

たとえば、あなたがBaiduのホーム・ページにアクセスし、ブラウザがウェブネットワークIOを介して取得する必要があります。ブラウザは、あなたがそれを伝えたいBaiduは、htmlのURLへの要求をサーバに送信し、このアクションは、と呼ばれる出力のデータを送信されます。Baiduのサーバは、ページの内容を介して送信され、このアクションは、入力と呼ばれる外部からのデータを受信することです。

そのため、通常は、操作手順が完了しているIOの入力と出力は、2つのデータストリームを持っています。もちろん、一つだけの場合は、例えば、メモリにディスクからファイルを読み取るだけの入力操作は、順番に、単に出力操作、ディスクファイルにデータを書き込むことがあります。

入力と出力は、はいどのオブジェクトの特定を検討するために、相対的です。一般的に、我々はプログラムのために、プログラムにディスクのデータに相当するディスクファイルを、読み取るためのプログラムのニーズを書くとき、データの読み取りは、入力に属しますが、ディスク、データ出力に相当するためこのプログラムは、出力データが出力に属します。

IOのプログラミングは、ストリーム(ストリーム)は非常に重要な概念である、水に水道管はデータですが、唯一の一方向の流れ、水道管の流れと考えることができます。入力ストリームデータフローがメモリ(ディスク、ネットワーク)への外部からのものである、出力ストリームのデータフローがメモリに外部からです。Webブラウジング、少なくとも2本のパイプを確立する必要性との間に、ブラウザとサーバーの場合、それは両方の送信データができますが、また、収集データへ。

CPUとメモリはるかに速いスピード周辺機器よりも、そのIOプログラミングので、スピードと一致していない重大な問題があります。ディスクに書き込む必要があり、CPU 100M出力データがデータを受信するためにわずか0.01秒を必要としますが、この100Mのディスク、データの100Mとして、例えば、取るそれを行う方法を、10秒かかることがありますか?2つの方法があります。

  • 第1のCPUは、プログラムは、後続のコードを中断され、そして他のデータは、10秒のディスク100Mに書き込まれ、その後、ダウン次いで行わ、このモードは同期IOと呼ばれ、待機しています。
  • 別のアプローチは、ディスクがちょうど言われ、CPUを待たないことです「ではない心配を行い、ゆっくりとあなたの古い書き込み、私は、他のことをやるようになった」とし、その後のコードは、その後すぐに、このモードは、非同期IOと呼ばれて実行することができます。

同期および非同期IOとの間の差は、実行の結果を待つかどうかです。あなたがマクドナルドの食事に行くように、あなたが言う「ハンバーガーに、」ウェイターはごめんなさい、あなたに言った、ハンブルクは、あなたがレジの前に立って、5分を待つために、今行うには買い物に行くためにハンバーガーを取得するために5分を待っていましたこれは、同期IOです。

あなたはとてもよく買い物に行く、とすることができ、ハンブルクの必要性が5分を待つように「ハンバーガーに」ウェイターがあなたに言った、と言う、我々はあなたが、一度それ以外の場合は(モール)を行うことができるように知ってもらおうました非同期IO。

もちろん、書き込みプログラムに対して非同期IOを使用すると、同期IO性能よりもはるかに高いですが、欠点は、非同期IOは、モデルの複雑さをプログラミングすることです。「よくハンブルク」、あなたが知っているようにするとき知っている必要があり、それについて考え、あなたのアプローチも異なる気づきます。ウェイターがあなたを見つけるために実行した場合は、ウェイターの送信テキストメッセージは、あなたは常にポーリングモードで携帯電話を、チェックする必要があることを通知する場合、これは、補正モードです。要するに、複雑さは、同期、非同期IO IOよりもはるかに高いです。

IO機能動作は言語のプログラミング、オペレーティングシステムによって提供される、使いやすいカプセル化するために低いCインターフェースを置く各オペレーティング・システムは、Pythonは例外ではありません。

最も一般的なファイルの読み込みと書き込みIO操作があります。Pythonは、読むための機能と書き込みファイルの使用状況を内蔵、およびCは互換性があります。

ファイルを読み書きする前に、我々は最初の読み込みとディスクの機能上の書き込みファイルがオペレーティングシステムによって提供されている、見ている、近代的なオペレーティングシステムは、読み取りと書き込みのファイルを開いて、Aへのオペレーティングシステムを要求している、直接ディスクにプログラムの正常な動作を許可していません。ファイル・オブジェクト(通常、ファイルディスクリプタとも呼ばれる)、オペレーティング・システムによって提供されるインタフェースは、このファイル・オブジェクトから、またはファイル・オブジェクト(ライト・ファイル)への書き込みデータ(ファイルの読み出し)データを読み出します。


2読み取りファイル

モードでファイルを開くには、ファイル名と識別子を渡し、Pythonの組み込みのopen()関数を使用して、ファイルオブジェクトをお読みください。

>>> f = open('C:\\Users\\hfqn\\Desktop\\test.txt', 'r')

我々は成功したファイルを開くことができるので、読み取りのための識別子は「r」、。

ファイルが存在しない場合、open()関数は例外IOErrorのエラーをスローし、エラーコードに関する詳細情報を提供し、ファイルが存在しないことを教えてくれます。

>>> f=open('C:\\Users\\hfqn\\Desktop\\notfound.txt', 'r')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\hfqn\\Desktop\\notfound.txt'

ファイルが正常に開かれている場合、読み取りコール()メソッドは、ファイルの内容全体を読み取ることができ、PythonはSTRオブジェクトとして表さ、メモリの内容を読み取ります。

>>> f.read()
'Hello, world!'

最後のステップは、ファイルを閉じるためにclose()メソッドを呼び出すことです。ファイルオブジェクトを開くことができるファイルの数が限られていると同時に、オペレーティングシステムおよびオペレーティングシステムのリソースを占有するので、ファイルが終了した後、閉じていなければなりません。

>>> f.close()

例外IOErrorファイルの読み取りと書き込みを生成する可能性があるときので、エラーと、バックf.close()が呼び出されません。そのため、エラーが適切に近いファイル、我々は試して使用できる可能性かどうかを確実にするために...最終的に実現されます。

try:
    f = open('\path\to\file', 'r')
    print(f.read())
finally:
    if f:
        f.close()

しかし、あまりにも面倒であらゆるので、現実的なので、Pythonは自動的に私たちはclose()メソッドを呼び出す支援する声明を導入しました:

with open('\path\to\file', 'r') as f:
    print(f.read())

これは、tryの前で...最終的には同じですが、コードはf.close()メソッドを呼び出す必要が優れて簡単で、ありません。

コールは、ファイルが10G、バーストのメモリを持っている場合ので、保険の目的のために、あなたは何度読んで(サイズ)メソッドを呼び出すことができ、サイズまで読んで、各コンテンツのバイト、ワンタイム・ファイルの内容全体を読みます)(読み。

また、readlineのへの呼び出しは()の戻りリストに、すべてのコンテンツ、[OK]を押しますを読むことreadlines()時間を呼び出してテキストの各行を読み取ることができます。したがって、あなたがコールする方法を決定するために、必要に応じて。

ファイルが小さい場合、(読み)最も便利なワンタイムを読み込み、ファイルサイズを決定することができない場合は、繰り返し(サイズ)より安全な読み取りを呼び出し、最も便利な、それは設定ファイルである場合、コールreadlines():

with open('\path\to\file', 'r') as f:
    for line in f.readlines():
        print(line.strip())         # 把末尾的'\n'删掉

デフォルトでは、読み込むためのテキストファイルの前で話すと、UTF-8エンコードされたテキストファイルです。などの写真、ビデオ、などのバイナリファイルを、読み取るには、「RB」モードファイルで開くことができます。

>>> f = open('C:\\Users\\hfqn\\Desktop\\test.jpg', 'rb')
>>> f.read()
b''\x89PNG\r\n\x1a\n\x00\x00\x00...'     # 十六进制表示的字节

非UTF-8でエンコードされたテキストファイルを読み取るには、必要性は、符号化パラメータを渡す()関数を開くには、例えば、GBKファイルをエンコード読んで:

>>> f = open('C:\\Users\\hfqn\\Desktop\\gbk.txt','r',encoding='gbk')
>>> f.read()
'人生苦短,我用python'

いくつかの非標準のコーディング出会いファイル、テキストファイルに不正な文字エンコーディングの一部と混合することができるので、あなたは、UnicodeDecodeErrorが発生することがあります。もし経験のショーがどのようにコーディングエラー処理このような場合には、open()関数も、パラメータ誤差を受けます。最も簡単な方法は、単に無視することです:

>>> f = open('C:\\Users\\hfqn\\Desktop\\gbk.txt','r',encoding='gbk', errors='ignore')

:Pythonのセクション「Python2のエンコードとデコードの文字のpython3」についてのエンコーディングhttp://www.jianshu.com/p/19c74e76ee0a


3ライト・ファイル

書き込みファイルやドキュメントを読んで唯一の違いは、コールは、()関数を開いて書き込みテキストファイルと「wb」「W」の着信識別子またはバイナリファイルを書き込むことで、同じです。

>>> f = open('C:\\Users\\hfqn\\Desktop\\test.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()

あなたは、ファイルへの書き込みに繰り返し書き込みを()を呼び出しますが、ファイルを閉じるには、コールf.close()を確認することができます。

私たちは、ファイルを書き込むときに、オペレーティングシステムは、多くの場合、ディスクへの書き込みではない、すぐにデータの操作を行いますが、メモリ、空き時間にキャッシュされ、その後、ゆっくりと書きます。close()メソッドを呼び出すだけで、オペレーティング・システムは、データがすべてのディスクに書き込ま書き込まれないことを確実にするためでした。データの結果は、ディスクの一部のみを書き込むことができ、そして残りは失われる)(クローズ呼び出すことを忘れ。だから、まだ文で保険が付属しています:

with open('C:\\Users\\hfqn\\Desktop\\test.txt', 'w') as f:
    f.write('Hello, world!')

特定のエンコードされたテキストファイルを書き込むには、自動的に、符号化パラメータ渡し()関数を開くエンコーディングを指定する文字列を変換します。


4 StringIOを和BytesIO

多くの場合、データの読み取りと書き込みは必ずしもファイルではありません、あなたはまた、メモリに読み書きすることができます。筋力はStringIOはメモリに読み込まれます。

strがたStringIOを記述する必要があり、私たちは、ファイルを書き込むことができますように、そして、StringIOをを作成する必要があります。

>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!

getValue()メソッドは、書かれたSTRを得るために使用されます。

たStringIOを読むには、あなたがたStringIO初期化STRを使用することができ、その後、同じ文書を読むように読み取ります。

>>> from io import StringIO
>>> f = StringIO('Hello!\nHi!\nGoodbye!')
>>> while True:
...     s = f.readline()
...     if s == '':
...         break
...     print(s.strip())

Hello!
Hi!
Goodbye!

あなたがバイナリデータを使用している場合のStringIO操作は唯一、STRすることができ、あなたはBytesIOを使用する必要があります。

読んで、メモリをバイト単位で書き込み達成BytesIO、我々はBytesIOを作成し、いくつかのバイトを書き込みます:

>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'

書き込みがstrのではなく、UTF-8エンコードされたバイトの後のことに注意してください。

StringIOをと同様に、BytesIOバイトで初期化することができ、その後、同じ文書を読むように読み取ります。

>>> from io import BytesIO
>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
>>> f.read()
b'\xe4\xb8\xad\xe6\x96\x87'

そして、オペレーティングたStringIO BytesIO STRの方法とは、読み取りと書き込みのファイルは一貫性のあるインタフェースを持つようにすることを、メモリにバイト。


テキストが不明であるか、問題がある場合、以下のコメント領域にメッセージを残してくださいすることをお見つけた場合、私はあなたのレビュー、更新テキストの内容に基づいて行われます、ありがとうございました!

おすすめ

転載: www.cnblogs.com/taosiyu/p/12056099.html