Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [Python] [2.7.12] Aprire un file di testo in lettura/scrittura

    Premessa sono neofita del Python.

    Ho provato a scrivere un programmino che dato un file di testo, permetta di inserire (ad una certa riga) o cancellare una parola in un testo.

    codice:
    def inserimento(elem, riga):
        f=open("./Testo.txt", 'r')
    
        lst_str = f.readlines()
    
        if int(riga) > len(lst_str):
            print "     Indice troppo alto."
            f.close()
        else:
            lst_str[int(riga) - 1] = lst_str[int(riga) - 1][:-1] + " " + elem + "\n"
            f.close()
    
    
            f = open("./Testo.txt", 'w')    
            f.writelines(lst_str)
            f.close()

    codice:
    def cancellazione(elem):        
        f=open("./Testo.txt", 'r')
    
        lst_str = f.readlines()
        lst_str_new = None
        
        conta = sum ([elList.count(elem) for elList in lst_str])
       
        if conta == 0:
            print "     Elemento %s non trovato" %elem
        else:
            print "     Sono state trovate %d occorrenze di %s" %(conta, elem)
    
        f.close()
        
        # si esegue il replace di elem con la stringa vuota ""
        f = open("./Testo.txt", 'w')    
        lst_str_new = [elList.replace(elem, "") for elList in lst_str]
        f.writelines(lst_str_new)    
        f.close()

    Queste due funzioni funzionano. Solo che prima avevo cercato di aprire il file in "r+" ma la soluzione non è ottimale. Sapete spiegarmi il motivo? Grazie
    My space! Voglio Arthur!!!
    Ho fatto strike!!!
    dotty78

    Prima di postare in “XML, XSL, Smil” dai uno sguardo ai Link utili!

  2. #2
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,190
    perché dici che aprire il file in "r+" non è ottimale?
    che problemi ti ha dato?

  3. #3
    Quote Originariamente inviata da clasku Visualizza il messaggio
    perché dici che aprire il file in "r+" non è ottimale?
    che problemi ti ha dato?
    Supponiamo che nel mio file "Testo.txt" ho:
    Zoe
    Peppa
    Pippo
    Pluto

    Se ad es. scrivo così

    codice:
    def cancellazione(elem):        f=open("./Testo.txt", 'r+')
    
    
        lst_str = f.readlines()
        lst_str_new = None
        
        # Usiamo lo strumento sum per contare le occorrenze di elem
        # in ogni stringa della lista lst_str 
        # Usiamo il metodo count per contare la singola occorrenza di count
        # in una singola stringa della lista (COMPREHENSION)
        conta = sum ([elList.count(elem) for elList in lst_str])
       
        if conta == 0:
            print "     Elemento %s non trovato" %elem
        else:
            print "     Sono state trovate %d occorrenze di %s" %(conta, elem)
    
    
     #   f.close()
        
    
    
        # si esegue il replace di elem con la stringa vuota ""
     #   f = open("./Testo.txt", 'w')    
        lst_str_new = [elList.replace(elem, "") for elList in lst_str]
        f.writelines(lst_str_new)    
        f.close()
    Dopo aver invocato questa funzione per la parola "Peppa" ho:

    ZoePeppa
    Pippo
    Pluto


    Zoe


    Pippo
    Pluto
    Ovvero ho una duplicazione del file e nella seconda parte non avrò la stringa "Peppa"
    My space! Voglio Arthur!!!
    Ho fatto strike!!!
    dotty78

    Prima di postare in “XML, XSL, Smil” dai uno sguardo ai Link utili!

  4. #4
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,190
    ah, giusto
    forse "w+" può funzionare meglio (dovrebbe troncare il file a partire dall'inizio)

  5. #5
    Quote Originariamente inviata da clasku Visualizza il messaggio
    ah, giusto
    forse "w+" può funzionare meglio (dovrebbe troncare il file a partire dall'inizio)
    con "w+" il file sarà vuoto... e con "rw" mi da errore di sintassi se non ricordo male (ora sono a casa)
    My space! Voglio Arthur!!!
    Ho fatto strike!!!
    dotty78

    Prima di postare in “XML, XSL, Smil” dai uno sguardo ai Link utili!

  6. #6
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,190
    verissimo, ho scritto senza ragionare
    io comunque le due funzioni le scriverei così

    codice:
    def my_inserimento(elem, riga):
        # apro il file in lettura
        with open("Testo.txt", "r") as f:
            # salvo i dati
            data = f.readlines()
        if riga >= 1:
            # inserisco la riga
            data.insert(riga - 1, elem + "\n")
            # riapro il file in scrittura
            with open("Testo.txt", "w") as fo:
                # scrivo i nuovi valori
                fo.write("".join(data))
        else:
            print "La riga 0 non esiste, inserisci un valore maggiore"
    
    def my_cancellazione(elem):
        # apro il file in lettura
        with open("Testo.txt", "r") as f:
            # salvo i dati
            data = f.readlines()
        # setto un contatore
        c = 0
        # riapro il file in lettura
        with open("Testo.txt", "w") as fo:
            # scorro i valori
            for d in data:
                # se non trovo elem scrivo...
                if elem not in d:
                    fo.write(d)
                # ... altrimenti incremento il contatore
                else:
                    c += 1
        if c > 0:
            print "Ho trovato {} occorrenze di {}".format(c, elem)
        else:
            print "Elemento {} non trovato".format(elem)

  7. #7
    Grazie clasku.

    ho provato le tue soluzioni.
    Unica modifica apportata è stata la conversione a intero della riga

    codice:
    def my_inserimento(elem, riga):    # apro il file in lettura
        with open("Testo.txt", "r") as f:
            # salvo i dati
            data = f.readlines()
        if int(riga) >= 1:
            # inserisco la riga
            data.insert(int(riga) - 1, elem + "\n")
            # riapro il file in scrittura
            with open("Testo.txt", "w") as fo:
                # scrivo i nuovi valori
                fo.write("".join(data))
        else:
            print "La riga 0 non esiste, inserisci un valore maggiore"
    Ora studierò un po' meglio my_cancellazione.

    Grazie!


    PS: Cmq vedo che anche tu sei stato costretto ad aprire il file prima in lettura e poi in scrittura
    My space! Voglio Arthur!!!
    Ho fatto strike!!!
    dotty78

    Prima di postare in “XML, XSL, Smil” dai uno sguardo ai Link utili!

  8. #8
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,190
    si, ma è anche una mia forma mentis quella di leggere e riaprire: spesso faccio una copia del file da leggere e la apro, così poi quando scrivo sul file non rischio di perdere dati per qualche errore

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.