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
アプリケーションの場合、上記で説明したように、ファイル反復メソッドが最適です。