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

Jinku Hu 10 ottobre 2023
  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
Come leggere un file riga per riga ad una lista 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.

Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - Python String