PROBLEMA Salvare un output su python

Pubblicità

Metallkros

Nuovo Utente
Messaggi
60
Reazioni
18
Punteggio
24
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
 
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
 
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.
 
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:
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?
 
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
 
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()
 
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:
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?
 
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.
 
Non ho visto che csv.writer() ha bisogno della modalità di testo con Python3. Se lavori col 2, funziona tranquillamente con wb.
 
Ultima modifica:
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:
Pubblicità
Pubblicità
Indietro
Top