Python で 1 行ずつリストに 1つのファイルを読み取る方法

  1. Python で 1 行ずつファイルを読み取る readlines
  2. ファイルメソッドを反復処理して、Python で 1 行ずつファイルを読み取ります
  3. Python で 1 行ずつファイルを読み取る file.read メソッド
  4. 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 アプリケーションの場合、上記で説明したように、ファイル反復メソッドが最適です。

関連記事 - Python String

  • Python が文字列を日時 datetime に変換する方法
  • comments powered by Disqus