前提条件:
Python には、ファイルの作成、書き込み、読み取りのための組み込み関数が用意されています。 Pythonで扱えるファイルには通常のテキストファイルとバイナリファイル(0と1のバイナリ言語で書かれたもの)の2種類があります。この記事では、ファイルから 1 行ずつ読み取る方法を学習します。
方法 1: readlines() を使用してファイルを 1 行ずつ読み取る
readlines() は、すべての行を一度に読み取り、それを各行としてリスト内の文字列要素として返すために使用されます。この関数は、ファイルの内容全体をメモリに読み取り、個別の行に分割するため、小さなファイルに使用できます。リストを反復処理し、strip() 関数を使用して改行文字「 」を削除できます。
例:
Python3
# Python code to> # demonstrate readlines()> L>=> [>'Geeks
'>,>'for
'>,>'Geeks
'>]> # writing to file> file1>=> open>(>'myfile.txt'>,>'w'>)> file1.writelines(L)> file1.close()> # Using readlines()> file1>=> open>(>'myfile.txt'>,>'r'>)> Lines>=> file1.readlines()> count>=> 0> # Strips the newline character> for> line>in> Lines:> >count>+>=> 1> >print>(>'Line{}: {}'>.>format>(count, line.strip()))> |
>
>
出力:
Line1: Geeks Line2: for Line3: Geeks>
指定された Python コードの時間計算量は O(n) です。ここで、n はファイル内の総行数です。
コードの補助空間の複雑さは O(n) です。ここで、n はファイル内の総行数です。
方法 2: readline() を使用してファイルを 1 行ずつ読み取る
readline() 関数は、ファイルの 1 行を読み取り、それを文字列の形式で返します。パラメータ n を受け取り、読み取られる最大バイト数を指定します。ただし、n が行の長さを超えた場合でも、複数の行を読み取ることはありません。すべてのデータを一度にフェッチするのではなく、行ごとにフェッチするため、大きなファイルを読み取る場合に効率的です。 readline() は、最後に改行文字を含むファイルの次の行を返します。また、ファイルの終わりに達した場合は、空の文字列を返します。
例:
段階的なアプローチ:
- 改行文字を含む 3 つの文字列要素を含むリスト L を作成します。
- myfile.txt という名前のファイルを書き込みモードで開き、それを変数 file1 に割り当てます。
- ファイル オブジェクト file1 の writelines() メソッドを使用して、リスト L の内容をファイルに書き込みます。
- close() メソッドを使用して、ファイル オブジェクト file1 を閉じます。
- myfile.txt という名前のファイルを読み取りモードで開き、それを変数 file1 に割り当てます。
- 変数 count を 0 に初期化します。
- 無限ループを開始します。
- ループの反復ごとに変数 count を 1 ずつインクリメントします。
- readline() メソッドを使用してファイル オブジェクト file1 から次の行を読み取り、それを変数 line に割り当てます。
- line 変数が空かどうかを確認します。空の場合は、ファイルの終わりに達したことを意味します。その場合は、break 文を使用してループを抜けてください。
- string クラスの format() メソッドを使用して、count の値と line の内容を出力します。 strip() メソッドは、行末の改行文字を削除するために使用されます。
- close() メソッドを使用して、ファイル オブジェクト file1 を閉じます。
Python3
ミア・ハリファの年齢
# Python program to> # demonstrate readline()> L>=> [>'Geeks
'>,>'for
'>,>'Geeks
'>]> # Writing to a file> file1>=> open>(>'myfile.txt'>,>'w'>)> file1.writelines((L))> file1.close()> # Using readline()> file1>=> open>(>'myfile.txt'>,>'r'>)> count>=> 0> while> True>:> >count>+>=> 1> ># Get next line from file> >line>=> file1.readline()> ># if line is empty> ># end of file is reached> >if> not> line:> >break> >print>(>'Line{}: {}'>.>format>(count, line.strip()))> file1.close()> |
>
>
出力:
Line1 Geeks Line2 for Line3 Geeks>
方法 3: for ループを使用してファイルを 1 行ずつ読み取る
反復可能なオブジェクトは、ファイルを開くときに open() 関数によって返されます。ファイルを 1 行ずつ読み取るこの最後の方法には、for ループでファイル オブジェクトを反復処理することが含まれます。これを行う際に、反復可能オブジェクトの使用と組み合わせて for ループを使用して暗黙的にファイル オブジェクトを反復処理できる組み込みの Python 関数を利用しています。このアプローチでは必要なコード行が少なくなり、常に従う価値のあるベスト プラクティスです。
例:
Javaで配列をソートする方法
Python3
# Python program to> # demonstrate reading files> # using for loop> L>=> [>'Geeks
'>,>'for
'>,>'Geeks
'>]> # Writing to file> file1>=> open>(>'myfile.txt'>,>'w'>)> file1.writelines(L)> file1.close()> # Opening file> file1>=> open>(>'myfile.txt'>,>'r'>)> count>=> 0> # Using for loop> print>(>'Using for loop'>)> for> line>in> file1:> >count>+>=> 1> >print>(>'Line{}: {}'>.>format>(count, line.strip()))> # Closing files> file1.close()> |
>
>
出力:
Using for loop Line1: Geeks Line2: for Line3: Geeks>
方法 4: for ループとリスト内包表記を使用してファイルを 1 行ずつ読み取る
リスト内包表記は、式を含む括弧で構成されます。この式は、各要素を反復する for ループとともに各要素に対して実行されます。ここでは、テキスト ファイルを読み取り、リストからすべての改行文字を削除した別の出力に改行文字を含む生データを出力します。
例
Python3
文字列が長すぎる
with>open>(>'myfile.txt'>) as f:> >lines>=> [line>for> line>in> f]> print>(lines)> # removing the new line characters> with>open>(>'myfile.txt'>) as f:> >lines>=> [line.rstrip()>for> line>in> f]> print>(lines)> |
>
>
出力:
['Geeks ', 'For ', 'Geeks'] ['Geeks', 'For', 'Geeks']>
ステートメント付き
上記のアプローチでは、ファイルを開くたびに明示的に閉じる必要があります。ファイルを閉じるのを忘れると、コードにいくつかのバグが発生する可能性があります。つまり、ファイル内の多くの変更は、ファイルが適切に閉じられるまで有効になりません。これを防ぐには with ステートメントを使用できます。 Python の With ステートメントは例外処理で使用され、コードがすっきりして読みやすくなります。ファイル ストリームなどの共通リソースの管理が簡素化されます。 with ステートメントを使用することでコードがどのようにクリーンになるかについては、次のコード例をご覧ください。ステートメントで使用する場合、file.close() を呼び出す必要はありません。 with the ステートメント自体により、リソースの適切な取得と解放が保証されます。
例:
Python3
# Python program to> # demonstrate with> # statement> L>=> [>'Geeks
'>,>'for
'>,>'Geeks
'>]> # Writing to file> with>open>(>'myfile.txt'>,>'w'>) as fp:> >fp.writelines(L)> # using readlines()> count>=> 0> print>(>'Using readlines()'>)> with>open>(>'myfile.txt'>) as fp:> >Lines>=> fp.readlines()> >for> line>in> Lines:> >count>+>=> 1> >print>(>'Line{}: {}'>.>format>(count, line.strip()))> # Using readline()> count>=> 0> print>(>'
Using readline()'>)> with>open>(>'myfile.txt'>) as fp:> >while> True>:> >count>+>=> 1> >line>=> fp.readline()> >if> not> line:> >break> >print>(>'Line{}: {}'>.>format>(count, line.strip()))> # Using for loop> count>=> 0> print>(>'
Using for loop'>)> with>open>(>'myfile.txt'>) as fp:> >for> line>in> fp:> >count>+>=> 1> >print>(>'Line{}: {}'>.>format>(count, line.strip()))> |
>
>
出力:
Using readlines() Line1: Geeks Line2: for Line3: Geeks Using readline() Line1: Geeks Line2: for Line3: Geeks Using for loop Line1: Geeks Line2: for Line3: Geeks>