Forum >> Programmazione Python >> Files e Directory >> [Aiuto!] Copiare contenuto file su lista riga per riga con ciclo for

Pagina: 1

Salve ha tutti!
Per quanto non vedo una grande utilità nel copiare il contenuto di un file in una lista,
la cosa non mi sta facendo dormire la notte...

Se scrivo:

test=open("test3.txt")
new_list0=test.readline()
new_list1=test.readline()
new_list2=test.readline()
test.close()
print("\nnew_list con 3 redline():", new_list)
print("new_list Type:", type(new_list))
print("\n")

riesco a copiare le prime tre stringhe del file test.txt in new_list, ed ad indicizzarle una ad una.
Volendo rendere dinamico il codice precedente, ho provato ad usare un ciclo for nel seguente modo:
new_list=[]
i=0
test=open("test3.txt")
for line in test:
new_list=test.readline()
i=i+1
test.close()
print("\nnew_list con for:", new_list)

oppure

new_list=[]
i=0
test=open("test3.txt")
for line in test:
print("Linea",i+1,":",line)
print("Linea",i+1,"Type:",type(line))
new_list=line
i=i+1
test.close()
print("\nnew_list con for:", new_list)

o anche

i=0
j=0
test=open("test3.txt")
for line in test:
print(i)
i=i+1
print("\ntest3.txt contiene ",i," stringhe")
while j<i:
print(j)
new_listj=test.readline()
j+=1
test.close()
print("\nnew_list con for:", new_list)

ma in tutti i casi ottengo il seguente errore:

new_list=test.readline()
IndexError: list assignment index out of range

Qualcuno saprebbe spiegarmi il perché è come scrivere correttamente questo codice?

Usando .readlines() riesco ad ottenere il mio scopo correttamente ma quello che mi tormenta è come farlo leggendo il file riga per riga.

*P.S. Postando la domanda, ho notato che le parentesi quadre con l'indice dopo new_list scompaiono dal mio testo quando posto la domanda... Se non le vedete, sappiate che ci sono

Grazie in anticipo per le vostre risposte!


--- Ultima modifica di Rosario Pettinato in data 2021-12-14 17:32:05 ---
Rosario Pettinato said @ 2021-12-14 17:20:28:
...
Per quanto non vedo una grande utilità nel copiare il contenuto di un file in una lista,
la cosa non mi sta facendo dormire la notte...
...

Qualcuno saprebbe spiegarmi il perché è come scrivere correttamente questo codice?
--- Ultima modifica di Rosario Pettinato in data 2021-12-14 17:32:05 ---
prima di tutto, vediamo come leggere le righe di un file testo : supposto un file test.txt con questo contenuto:

NzP:~$ cd /media/ngiuseppe/1FA6-C648/src/posts/pettinato
NzP:~$ ls
test.txt
NzP:~$ cat test.txt
Apelle figlio di Apollo
fece una palla di pelle di pollo
e tutti i pesci vennero a galla
per vedere la palla di pelle di pollo
fatta da Apelle figlio di Apollo
NzP:~$
in python3 potremmo leggerne il contenuto, salvarlo in una lista e leggere la stessa in questo modo:

>>> with open('test.txt') as f:
	new_list = f.read().splitlines()

	
>>> for r in new_list:
	print(r)

	
Apelle figlio di Apollo
fece una palla di pelle di pollo
e tutti i pesci vennero a galla
per vedere la palla di pelle di pollo
fatta da Apelle figlio di Apollo
>>>
è da tener presente che, seppur possibile leggere una riga per volta, readline() NON SA se ha raggiunto la fine del file o meno, considerando che il file sopra ha 5 righe, readline() non farà una piega se vorremo leggere 10 righe

>>> with open('test.txt') as f:
	for i in range(10):
		print(f.readline())

		
Apelle figlio di Apollo

fece una palla di pelle di pollo

e tutti i pesci vennero a galla

per vedere la palla di pelle di pollo

fatta da Apelle figlio di Apollo






>>>
volendo "per forza" leggere una riga per volta, dovremo controllare "cosa" viene letto ed agire di conseguenza

>>> new_list_2 = []
>>> with open('test.txt') as f:
	row = ' '
	while row:
		row = f.readline()
		if row:
			new_list_2.append(row.replace('\n', ''))

			
>>> for r in new_list_2:
	print(r)

	
Apelle figlio di Apollo
fece una palla di pelle di pollo
e tutti i pesci vennero a galla
per vedere la palla di pelle di pollo
fatta da Apelle figlio di Apollo
>>>
gli indici NON sono la via pythonica per trattare gli iterabili, sono utili in alcuni casi ma bisogna avere le idee ben chiare su cosa si sta trattando, cognizione alquanto dubbia mi parrebbe.




Suggerirei di sviscerare almeno il tutorial di python e poi riprovarci.

Fatti non foste a viver come bruti...
nuzzopippo grazie di cuore per la tua dettagliata risposta!
La qualità del mio sonno è migliorata notevolmente ma restano due cose che mi tormentano...

".append" era quello che faceva al caso mio!

Sono riuscito così a salvare il contenuto di un file riga per riga con for nel seguente modo:
new_list2=[]
i=1
with open("test3.txt") as test:
    for index in test:
        print("Riga %0i" %i+":", index, end="")
        i+=1
        new_list2.append(index)
print("Questo è il contenuto di new_list2:", new_list2)
print("new_list2 Type:", type(new_list2))
print("\n")

Risultato:
Riga 1: Prima riga
Riga 2: Seconda Riga
Riga 3: Terza riga

Questo è il contenuto di new_list2: ['Prima riga\n', 'Seconda Riga\n', 'Terza riga\n']


new_list2 Type: <class 'list'>

Domanda 1: non usare .readline o simili come sopra è "male"?

Dato che non usare .readline mi lasciava qualche perplessità, ho provato a usarlo nel seguente modo ma il risultato mi ha confuso...
new_list3=[]
i=1
with open("test3.txt") as test:
    for line in test:
        read=test.readline() 
        print("Riga %0i" %i+":", read, end="")
        i+=1
        new_list3.append(read)
print("Questo è il contenuto di new_list3:", new_list3)
print("new_list3 Type:", type(new_list3))
print("\n")
Risultato:

Riga 1: Seconda Riga
Riga 2: Questo è il contenuto di new_list3: ['Seconda Riga\n', '']
new_list3 Type: <class 'list'>

Domanda 2: Perché ottengo questo risultato?


Grazie ancora per l'attenzione



--- Ultima modifica di Rosario Pettinato in data 2021-12-15 17:23:08 ---
Rosario Pettinato said @ 2021-12-15 17:17:04:
Domanda 1: non usare .readline o simili come sopra è "male"?
Definisci "male".

.readline() è uno dei numerosi metodi resi disponibili dall'oggetto "TextIOWrapper" che ottieni aprendo un file di testo, Ti permette di fare alcune cose, tipo leggere una singola riga di testo da un file, associato ad altri metodi ti "permetterebbe" di effettuare letture selettive in un file, è uno strumento da utilizzare quando occorre, non è ne' "male" ne' "bene"




Rosario Pettinato said @ 2021-12-15 17:17:04:
Domanda 2: Perché ottengo questo risultato?

Perché è quello che, goffamente, chiedi di ottenere, tornando all'esempio del mio precedente post


>>> f_name = 'test.txt'
>>> new_list = []
>>> with open(f_name) as f:
	print(type(f))
	for row in f:
		new_list.append(row)

		
<class '_io.TextIOWrapper'>
>>> type(new_list)
<class 'list'>
>>> new_list
['Apelle figlio di Apollo\n', 'fece una palla di pelle di pollo\n', 'e tutti i pesci vennero a galla\n',
'per vedere la palla di pelle di pollo\n', 'fatta da Apelle figlio di Apollo\n']
>>> 

si ottiene lo stesso risultato senza affannarsi con gli indici, gli oggetti "list" provvedono autonomamente ad indicizzare i dati nell'ordine di inserimento, nuovamente, gli indici servono per varie operazioni, tipo lo slicing


>>> new_list[3:]
['per vedere la palla di pelle di pollo\n', 'fatta da Apelle figlio di Apollo\n']
>>> 
o altro ma nel Tuo apparente stato di conoscenze mi sembra prematuro parlarne, ti confonderesti e basta, "cose" apparentemente semplici nascondono delle realtà estremamente complesse sotto la superficie, da apprendersi gradualmente.

Torno al mio precedente consiglio : leggiti sistematicamente almeno il tutorial, meglio ancora un buon libro, poi guardati la docs sul liste, funzioni builtin etc., per imparare e capire c'è bisogno di tempo, olio di gomito e gradualità.

Fatti non foste a viver come bruti...
Grazie per la risposta.
Seguirò sicuramente i tuo consigli ;)


Pagina: 1



Esegui il login per scrivere una risposta.