Come leggere un file riga per riga ad una lista in Python

  1. readlines per leggere il file riga per riga in Python
  2. Iterate sul metodo file per leggere un file riga per riga in Python
  3. Metodo file.read per leggere il file riga per riga in Python
  4. Confronto di diversi metodi nella lettura di un file riga per riga in Python

Supponiamo di avere un file con il contenuto sottostante,

Line One: 1
Line Two: 2
Line Three: 3
Line Four: 4
Line Five: 5

Dobbiamo leggere il contenuto del file riga per riga in una lista, ["Line One: 1", "Line Two: 2", "Line Three: 3", "Line Four: 4", "Line Five: 5"].

Introdurremo diversi metodi per leggere un file riga per riga in una lista qui sotto.

readlines per leggere il file riga per riga in Python

readlines restituisce una lista di linee dal flusso.

>>> 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']

Anche il carattere finale \n è incluso nella stringa e può essere rimosso con 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']

Iterate sul metodo file per leggere un file riga per riga in Python

Potremmo iterare sul file per leggerlo riga per riga, piuttosto che usare readlines.

>>> 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']

Questo metodo è molto meglio del metodo precedente dal punto di vista dell’uso della memoria. Il metodo readlines tiene tutte le linee del file in memoria, ma il metodo dell’interazione porta solo una linea del contenuto del file in memoria e la elabora. È preferibile se la dimensione del file è super grande per evitare l’errore di memoria.

Metodo file.read per leggere il file riga per riga in Python

file.read(size=-1, /) legge dal file fino a EOF se size non è impostato. Potremmo dividere le linee da esso utilizzando la funzione 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']

Il risultato non include il carattere finale \n nel metodo predefinito str.splitlines. Ma si potrebbe includere \n se il parametro keepends è impostato per essere True.

>>> 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']

Confronto di diversi metodi nella lettura di un file riga per riga in Python

Confronteremo le prestazioni di efficienza tra i diversi metodi introdotti in questo articolo. Aumentiamo il numero di righe nel file testato a 8000 per confrontare facilmente la differenza di prestazioni.

>>> 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

Il metodo readlines() è leggermente migliore del metodo di iterazione dei file, e file.read().splitlines() è il metodo più efficiente con un margine di oltre il 25% rispetto agli altri due metodi.

Ma, se nell’applicazione BigData dove la memoria è il vincolo, il metodo di iterazione dei file è il migliore, come spiegato sopra.

Articolo correlato - Python String

  • Come convertire una lista in stringa in Python
  • Trova il carattere in una stringa in Python