PDA

Visualizza la versione completa : [Python] [2.7.12] Aprire un file di testo in lettura/scrittura


dotty78
22-11-2016, 15:28
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.


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()



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

clasku
22-11-2016, 17:19
perché dici che aprire il file in "r+" non è ottimale?
che problemi ti ha dato?

dotty78
22-11-2016, 17:37
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ì


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"

clasku
22-11-2016, 18:01
ah, giusto
forse "w+" può funzionare meglio (dovrebbe troncare il file a partire dall'inizio)

dotty78
22-11-2016, 19:07
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)

clasku
22-11-2016, 19:59
verissimo, ho scritto senza ragionare :stordita:
io comunque le due funzioni le scriverei così



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)

dotty78
23-11-2016, 10:48
Grazie clasku.

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


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 ;)

clasku
23-11-2016, 11:11
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

Loading