Python でファイルを読み取る

概要

保存されたデータを操作するために、ファイル処理はすべてのプロの Python プログラマーのコア知識になります。 最初のリリースから、ファイルへのデータの読み取りと書き込みの両方が組み込みの Python 機能です。 C や Java などの他のプログラミング言語と比較して、非常に単純で、数行のコードしか必要としません。 さらに、それを適切に行うために追加のモジュールをロードする必要はありません。

この記事では、例を通して Python でファイルを読み取る方法を説明します。 いくつかの例には、ファイルを行ごとにチャンク (一度に定義された行数) として読み取ることや、ファイルを一度に読み取ることが含まれます。 また、ファイル全体を検索せずに、ファイルから特定の行のみを読み取る方法も示します。

Python でのファイルの基本

ファイルを操作する一般的な方法は次のとおりです。 open() ファイルを開くには、 seek() 指定されたオフセットでファイルの現在の位置を設定し、 close() 使い終わったら、ファイル オブジェクトを閉じます。 ビルトイン open() 関数は、読み取り、書き込み、または追加のためにファイルにアクセスするために使用されるファイル オブジェクトを表すファイル ハンドルを返します。

読み取りのためにファイルを開くとき、Python はシステムでファイルを開く方法を正確に知る必要があります。 読み取りとバイナリ モードでの読み取りの XNUMX つのアクセス モードを使用できます。 使用されるそれぞれのフラグは次のとおりです。 'r', 'rb'、ビルトインでファイルを開くときに指定する必要があります open() 関数。 最初のモードには、改行を表す「CR」(キャリッジ リターン) や「LF」(ラインフィード) などの特殊文字の解釈が含まれますが、バイナリ モードでは、データがそのまま保存される raw モードでデータを読み取ることができます。それ以上の解釈なしで。

ファイルを開くと、 open() 関数はファイル オブジェクトを返します。 これらのファイルオブジェクトには次のようなメソッドがあります read(), readline(), write(), tell(), seek(). 一部のファイル オブジェクト (またはファイルのようなオブジェクト) には、ここにリストされているものよりも多くのメソッドがありますが、これらは最も一般的なものです。 すべてのファイル オブジェクトがすべてのファイル メソッドを実装する必要があるわけではありません。

ファイルを XNUMX 行ずつ読み取る

最初の例は、C と C++ の XNUMX つのプログラミング言語に着想を得ています。 これはおそらく最も直感的なアプローチです。 open() 機能、 ファイルを一行ずつ読む readline() メソッドを呼び出し、読み取り直後に行を出力します。

ここで使用されているのは while ファイルから継続的に読み取るループ readline() メソッドはデータを返し続けます。 ファイルの終わり (EOF) に達した場合、 while ループが停止し、ファイル オブジェクトが閉じられ、他のプログラムが使用できるようにリソースが解放されます。


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

お気づきかもしれませんが、この例では明示的にファイルを開いたり閉じたりしています。 Python インタープリターは、Python プログラムの実行の最後に開いているファイルを自動的に閉じますが、明示的にファイルを閉じるには、 close() は優れたプログラミング スタイルであり、忘れてはなりません。

改善策として、 便利な反復子プロトコル Python 2.3 で導入されました。 これにより、 readline ループ:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

ここで使用されているのは for と組み合わせてループ in イテレータ。 現在の行は、 in イテレータ、ファイルから読み取られ、その内容が出力されます stdout. Python は、範囲外のファイルの開閉をカバーします。 非効率的ですが、これにより、ファイル ハンドルを処理する必要がなくなります。

残念ながら、上記のコードはあまり明示的ではなく、ファイルを閉じる処理を Python の内部ガベージ コレクションに依存しています。

Python 2.5 で導入された、 with コマンドは、プロセス全体をさらにカプセル化し、スコープ内のコード ブロック全体でファイルのオープンとクローズを XNUMX 回だけ処理します。


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

の組み合わせ with ステートメントと open() コマンドはファイルを XNUMX 回だけ開きます。 成功した場合、 for ループが実行され、行の内容が出力されます stdout.

さらに、 with ステートメントには副作用があります。 内部的に、Python インタープリターは tryfinally-block ファイルからの読み取りをカプセル化します。 次の例は、基本的に Python の内部で何が起こっているかを示しています。 with コード ブロック:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

行のチャンクとしてファイルを読み取る

これまで、ファイルを XNUMX 行ずつ処理してきました。 これは巨大なファイルの場合はかなり遅く、複数行を同時に読み取ることで改善できます。 それを達成するために、 islice() からのメソッド イタツール モジュールが登場します。 また、イテレータとして機能し、以下で構成されるデータのチャンクを返します。 n 行。 ファイルの最後では結果が短くなる可能性があり、最終的に呼び出しは空のリストを返します。

from itertools import islice

filename = "test.txt"

number_of_lines = 5

with open(filename, 'r') as input_file:
    lines_cache = islice(input_file, number_of_lines)
   
    for current_line in lines_cache:
        print (current_line)

ファイルから特定の行を読み取る

上記のメソッドを使用して、ファイルから特定の行を読み取るなど、他の便利なアクションを実行することもできます。 これを行うには、カウンターを利用し、ファイルを繰り返し処理しているときに適切な行に到達すると、適切な行を出力します。


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

これは簡単に理解できるはずですが、前の例よりも少し長くなります。 を使用して短縮できます。 ラインキャッシュ モジュールを開きます。

次の例は、 getline() 方法。 要求された行番号がファイル内の有効な行の範囲外の場合、 getline() メソッドは代わりに空の文字列を返します。


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

ファイル全体を一度に読み取る

最後になりましたが、前の例とは非常に異なるケース、つまりファイル全体を一度に読み取るケースを見ていきます。

ほとんどの場合、ファイル全体を読み取るのに十分なメモリが必要であることに注意してください。文字はあまり多くのスペースを占有することはありませんが、大きなファイルにはうんざりするからです。 次の例では、 with ステートメント、および read() 方法。 この場合、使用します read() ファイル コンテンツをデータ ストリームとしてロードするには、次のようにします。

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

Python はまた、 readlines() メソッドに似ています。 readline() 最初の例の方法。 とは対照的に read()、ファイルの内容はリストに格納され、内容の各行は項目です:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

一方、 readlines() EOF に達するまでファイルからコンテンツを読み取ります。 sizehint これは、読み取るバイト数です。

まとめ

いつものように、ファイルの内容を読み取る方法は複数あります。 速度に関しては、それらのすべてが多かれ少なかれ同じカテゴリに属しています。 どのソリューションが最適かは、特定のユース ケースによって異なります。 何が可能かを確認し、最適なソリューションを選択することは非常に役立つと思います。

Python はファイルの読み取りプロセスを大幅に簡素化しますが、それでも時々扱いにくい場合があります。 Pythonの公式ドキュメント 詳細はこちら

タイムスタンプ:

より多くの スタックアバス