Python で 1 行ずつリストに 1つのファイルを読み取る方法
-
Python で 1 行ずつファイルを読み取る
readlines - Python でファイルメソッドを繰り返し処理して 1 行ずつファイルを読み取る
-
Python で 1 行ずつファイルを読み取る
file.readメソッド - Python でファイルを 1 行ずつ読み取る際のさまざまな方法の比較
以下の内容のファイルがあるとします。
Line One: 1
Line Two: 2
Line Three: 3
Line Four: 4
Line Five: 5
ファイルの内容を 1 行ずつリストに読み込む必要があります ["Line One: 1", "Line Two: 2", "Line Three: 3", "Line Four: 4", "Line Five: 5"]。
ファイルを 1 行ずつ読み取るさまざまな方法を以下のリストに紹介します。
Python で 1 行ずつファイルを読み取る readlines
readlines はストリームから行のリストを返します。
>>> filePath = r"/your/file/path"
>>> with open(filePath, 'r', encoding='utf-8') as f:
f.readlines()
['Line One: 1\n', 'Line Two: 2\n', 'Line Three: 3\n', 'Line Four: 4\n', 'Line Five: 5']
終了文字 \n も文字列に含まれており、str.rstrip('\n') で削除できます
>>> with open(filePath, 'r', encoding='utf-8') as f:
[_.rstrip('\n') for _ in f.readlines()]
['Line One: 1', 'Line Two: 2', 'Line Three: 3', 'Line Four: 4', 'Line Five: 5']
Python でファイルメソッドを繰り返し処理して 1 行ずつファイルを読み取る
readlines を使用するのではなく、ファイルを反復して 1 行ずつ読み取ることができます。
>>> with open(filePath, 'r', encoding='utf-8') as f:
[_.rstrip('\n') for _ in f]
['Line One: 1', 'Line Two: 2', 'Line Three: 3', 'Line Four: 4', 'Line Five: 5']
この方法は、メモリ使用量の観点から上記の方法よりもはるかに優れています。readlines メソッドはファイルのすべての行をメモリに保持しますが、interation メソッドはファイルのコンテンツの 1 行だけをメモリに取得して処理します。MemoryError を回避するために、ファイルサイズが非常に大きい場合に推奨されます。
Python で 1 行ずつファイルを読み取る file.read メソッド
size が設定されていない場合、file.read(size=-1, /) は EOF までファイルから読み取ります。str.splitlines 関数を使用して、そこから行を分割できます。
>>> with open(filePath, 'r') as f:
f.read().splitlines()
['Line One: 1', 'Line Two: 2', 'Line Three: 3', 'Line Four: 4', 'Line Five: 5']
結果には、デフォルトの str.splitlines メソッドに終了文字 \n が含まれません。しかし、keepends パラメータが True に設定されている場合は、\n を含めることができます。
>>> with open(filePath, 'r') as f:
f.read().splitlines(keepends=True)
['Line One: 1\n', 'Line Two: 2\n', 'Line Three: 3\n', 'Line Four: 4\n', 'Line Five: 5']
Python でファイルを 1 行ずつ読み取る際のさまざまな方法の比較
この記事で紹介したさまざまな方法の効率パフォーマンスを比較します。テストしたファイルの行数を 8000 に増やして、パフォーマンスの違いを簡単に比較します。
>>> timeit.timeit('''with open(filePath, 'r', encoding='utf-8') as f:
f.readlines()''',
setup='filePath=r"C:\Test\Test.txt"',
number = 10000)
16.36330720000001
>>> timeit.timeit('''with open(filePath, 'r', encoding='utf-8') as f:
[_ for _ in f]''',
setup='filePath=r"C:\Test\Test.txt"',
number = 10000)
18.37279060000003
>>> timeit.timeit('''with open(filePath, 'r', encoding='utf-8') as f:
f.read().splitlines()''',
setup='filePath=r"C:\Test\Test.txt"',
number = 10000)
12.122660100000019
readlines() メソッドはファイル反復メソッドよりわずかに優れており、file.read().splitlines() は他の 2つのメソッドと比較して 25% 以上のマージンを持つ最も効率的なメソッドです。
しかし、メモリが制約条件である BigData アプリケーションの場合、上記で説明したように、ファイル反復メソッドが最適です。
