PROBLEMA Salvare un output su python

Metallkros

Nuovo Utente
60
18
Salve, ho creato questo programma per la ricerca nei file CSV, il problema è che non so bene come far salvare i dati "printati" in un altro file, nel codice riesco solo a creare un nuovo file, ma il risultato della ricerca non viene inserito, viene scritto solo 'none', allego il codice
Python:
import csv

def Logo():
    print('''
     _____                                                                         
  __|___  |__ ______ __    _____   ____   _ ____   ____ __    _______ ____ ______ 
 |   ___|    |   ___\  \  /|    \ |    \ | |    \ |    |\ \  /|   ___|    |   ___|
 |   |__     |`-.`-. \  \//|     \|     \| |     \|    |_\ \// `-.`-.|    |`-.`-. 
 |______|  __|______| \____|__|\__|__/\____|__|\__|______/__/ |______|____|______|
    |_____|             |___|                                                     
''')
    print('Programma per analizzare i file Csv\n')



Logo()

Nome_file = input('''
Inserisci il nome del file da aprire
''')

with open(Nome_file, newline='', encoding='ISO-8859-1') as filecsv:
    lettore = csv.reader(filecsv,delimiter=';')
    #print(lettore)
    print('vuoi visualizzare gli header?\n')
    V_Header = input('s/n\n')
    if V_Header == 's':
        header = next(lettore)
        print(header)
        input('premi invio per continuare')
    else:
        pass

    Nome_Ricerca=input('inserisci la città da ricercare\n')
    input('premi invio per iniziare ricerca')
    dati = [(riga[0],riga[5],riga[13],riga[14],riga[11]) for riga in lettore if riga[0] == Nome_Ricerca]
    print(dati)
    for comune in dati:
        risultato_ricerca = print(f'{comune[:2]} --coordinate: {comune[2]},{comune[3]} --email: {comune[4]}')
    print('\nSalvare ricerca?')
    In=input('s/n\n')
    if In == 's':
        Salvataggio = input('Inserisci il nome del nuovo file da creare')
        file_S= open(Salvataggio,"a")
        file_S.write(str(risultato_ricerca))
        file_S.close()
    else:
        exit
 

Andretti60

Utente Èlite
6,440
5,091
Perché in risultato_ricerca memorizzi il risultato della print invece della stringa da essere salvata
 
  • Mi piace
Reazioni: BAT

BAT

Moderatore
Staff Forum
Utente Èlite
22,918
11,562
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Per usare la print dovresti fare (a inizio file) una redirezione dell'output su file, importando le librerie python del systema operativo... un metodo inutilmente complicato quando ti basta fare come dice @Andretti60 : memorizzati tutto in una stringa e scrivila sul file
 
  • Mi piace
Reazioni: Andretti60

Metallkros

Nuovo Utente
60
18
Non ho ben capito come fare, ciò'è ho capito cosa intendete ma non capisco come applicarlo ,il risultato consiste in una lista molto lunga di stringhe.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,918
11,562
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
inizializza la stringa risultato prima del for (esternamente al for) con la stringa vuota
risultato_ricerca = "" #stringa vuota
nel for togli l'istruzione print e sostituiscila con
risultato_ricerca = risultato_ricerca + <resto della stringa risultato> # + concatena le stringhe

P.S.
...e per favore elimina l'inutile istruzione "else: pass", non si può vedere! lo stesso per "else: exit"
se l'input è "s" premerai "Invio" per terminare, non c'è bisogno di dire "altrimenti non fare nulla" il cursore continua a lampeggiare
stessa cosa per "else: exit": il programma è finito, a che serve specificare che bisogna uscire? tanto esce lo stesso!
Più in generale: l'else non è obbligatorio dopo if, soprattutto quando non c'è nulla da fare se una condizione NON si verifica.
 
Ultima modifica:

Metallkros

Nuovo Utente
60
18
Python:
    Nome_Ricerca=input('inserisci la città da ricercare\n')
    input('premi invio per iniziare ricerca')
    dati = [(riga[0],riga[5],riga[13],riga[14],riga[11]) for riga in lettore if riga[0] == Nome_Ricerca]
    print(dati)
    risultato_ricerca = ""
    for comune in dati:
        risultato_ricerca = risultato_ricerca+(f'{comune[:2]} --coordinate: {comune[2]},{comune[3]} --email: {comune[4]}')
    print('\nSalvare ricerca?')
    In=input('s/n\n')
    if In == 's':
        Salvataggio = input('Inserisci il nome del nuovo file da creare')
        file_S= open(Salvataggio,"a")
        file_S.write(str(risultato_ricerca))
        file_S.close()

però se tolgo il Print non vengono stampati i risultati, no?
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,918
11,562
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
scusa, ma stai iniziando ora a programmare ? altrimenti non faresti questa domanda...

La stampa, se vuoi, la fai dopo il for (perché, terminato il for, la stringa risultato è memorizzata)
print(risultato_ricerca), nella riga subito prima di print('\nSalvare ricerca?')
in alternativa puoi stampare di volta in volta il risultato parziale nel for usando una variabile stringa temporanea,
ossia metti nel for qualcosa come
ris = <la-nuova riga che vuoi stampare>
print(ris) #stampa una sola riga
risultato_ricerca = risultato_ricerca + ris #aggiorna la stringa risultato
 

Metallkros

Nuovo Utente
60
18
wooow sei perspicace!!
Quindi dovrebbe essere questo l'algoritmo
Python:
risultato_ricerca = ""
    for comune in dati:
        risultato_ricerca = risultato_ricerca+(f'{comune[:2]} --coordinate: {comune[2]},{comune[3]} --email: {comune[4]}')
    print(risultato_ricerca)
    print('\nSalvare ricerca?')
    In=input('s/n\n')
    if In == 's':
        Salvataggio = input('Inserisci il nome del nuovo file da creare')
        file_S= open(Salvataggio,"a")
        file_S.write(str(risultato_ricerca))
        file_S.close()
 

nullptr

Nuovo Utente
34
9
Aggiungerei che nessuno fino ad ora ha già detto che il tuo codice perde gradualmente linearità.

Dato che hai bisogno di utilizzare il modulo csv, continua ad utilizzarlo pure per scrivere nel file di testo attraverso la funzione writer(): non solo il codice sarà più leggibile, ne faciliterai pure il riutilizzo.

Inoltre utilizza with open(path, "wb") as output come hai fatto all'inizio, in questo modo in caso di eccezioni questa istruzione farà sì che il file si chiuda in automatico. Nota che nel tuo codice durante la scrittura del file dei risultati hai impostato la modalità append nell'apertura del file, ciò vuol dire che la scrittura non andrà bene se il file già esiste, mentre nell'esempio che ti ho mostrato viene utilizzata l'ordinaria modalità di scrittura write, quindi se il file già esiste verrà prima troncato a 0.
 
Ultima modifica:

Metallkros

Nuovo Utente
60
18
Aggiungerei che nessuno fino ad ora ha già detto che il tuo codice perde gradualmente linearità.

Dato che hai bisogno di utilizzare il modulo csv, continua ad utilizzarlo pure per scrivere nel file di testo attraverso la funzione writer(): non solo il codice sarà più leggibile, ne faciliterai pure il riutilizzo.

Inoltre utilizza with open(path, "wb") as output come hai fatto all'inizio, in questo modo in caso di eccezioni questa istruzione farà sì che il file si chiuda in automatico. Nota che nel tuo codice durante la scrittura del file dei risultati hai impostato la modalità append nell'apertura del file, ciò vuol dire che la scrittura non andrà bene se il file già esiste, mentre nell'esempio che ti ho mostrato viene utilizzata l'ordinaria modalità di scrittura write, quindi se il file già esiste verrà prima troncato a 0.
Python:
 if In == 's':
        Salvataggio = input('Inserisci il nome del nuovo file da creare')
        with open(Salvataggio,"wb") as output
        file_S.writer(str(risultato_ricerca))
        file_S.close()

intendi così? "wb" sta per write and? La modifica al codice che aveva consigliato @BAT00cent è corretta?
 

nullptr

Nuovo Utente
34
9
intendi così? "wb" sta per write and?
Qui potrai documentarti: scrittura in modalità binaria.

Python con la modalità testuale di scrittura (quindi passando w o wt) codificherà il risultato con la codifica di testo predefinita. Dato che come hai scritto nel codice il file csv potrebbe utilizzare un'altra codifica, ti consiglio di andare sul sicuro aprendolo con quella.


La modifica al codice che aveva consigliato @BAT00cent è corretta?
Potresti emendare un po' il codice, inoltre la parte dell'append fallirebbe come già ho detto se il file dovesse già esistere.
 

nullptr

Nuovo Utente
34
9
Non ho visto che csv.writer() ha bisogno della modalità di testo con Python3. Se lavori col 2, funziona tranquillamente con wb.
 
Ultima modifica:

BAT

Moderatore
Staff Forum
Utente Èlite
22,918
11,562
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Nota che nel tuo codice durante la scrittura del file dei risultati hai impostato la modalità append nell'apertura del file, ciò vuol dire che la scrittura non andrà bene se il file già esiste,
falso:
sui file di testo la modalità "a" (append) scrive a fine file se esso già esiste, altrimenti crea automaticamente un nuovo file e inizia a scriverci
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!