Forum
>>
Programmazione Python
>>
Files e Directory
>>
[Aiuto!] Copiare contenuto file su lista riga per riga con ciclo for
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da Rosario Pettinato |
2021-12-14 17:20:28 - [Aiuto!] Copiare contenuto file su lista riga per riga con ciclo for
|
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 --- |
|
Scritto da nuzzopippo |
2021-12-15 11:46:55 - Re: [Aiuto!] Copiare contenuto file su lista riga per riga con ciclo for
|
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... |
|
Scritto da Rosario Pettinato |
2021-12-15 17:17:04 - Re: [Aiuto!] Copiare contenuto file su lista riga per riga con ciclo for
|
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 --- |
|
Scritto da nuzzopippo |
2021-12-16 08:25:06 - Re: [Aiuto!] Copiare contenuto file su lista riga per riga con ciclo for
|
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"
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... |
|
Scritto da Rosario Pettinato |
2021-12-16 16:21:30 - Re: [Aiuto!] Copiare contenuto file su lista riga per riga con ciclo for
|
Grazie per la risposta.
Seguirò sicuramente i tuo consigli |
Pagina: 1
Esegui il login per scrivere una risposta.