Forum >> Principianti >> Non so da che parte farmi aiuto

Pagina: 1

Buongiorno a tutti,

vi chiedo aiuto perche leggendo anche qualche guida non ho veramente idea di come posso fare.

Io ho un file di testo contenente una serie di valori esadecimali ed una serie di coordinate con 3 cifre decimali. All'interno del file ogni riga che inizia con "topolog" "punto" "linea" "testo" è successivamente seguita da una serie di coordinate(che sono riferite rispettivamente al punto o alla lineea ecc..) e nel caso dei topolog anche da altri valori.Io volevo fare un programma che riscrive lo stesso file di testo ma con i valori delle coordinate arrotondate alla seconda cifra decimale.

Ho fatto un po di prove e fino all apertura del file e l'inserimento del contenuto all interno di una lista o stringa ci riesco utilizzando le funzioni "readline e readlines" ma veramente non riesco ad arrivare oltre.

Mi potete dare una mano?

Sotto (e allegati) vi incollo il testo contenuto in un file txt che voglio elaborare e il testo rimaneggiato a mano che vorrei riuscire a produrre in automatico.




--Testo Originale--




Prova di troncamento

topolog 59 505C 0 5 255 255 ffffffff ffffffff ffffffff

953099.454 4833258.392 449.9962

id 94562a9a

id ad05cf55

topolog 6 505C 0 5 255 255 ffffffff ffffffff ffffffff

953036.809 4833296.546 49.4552

id 5362d82c

id 4a22524d

id cfd329c4

id 549e2492

id 888d59ec

id d6ee3849

punto 5 932 ffffffff ffffffff ffffffff

953380.340 4832909.096 695.993

punto 5 932 ffffffff ffffffff ffffffff

953925.959 4832598.424 669.652

linea 5 505063 5 255 255 ffffffff ffffffff ffffffff

954298.392 4832489.953 599.286 0

954302.200 4832485.609 599.286 0

954306.295 4832489.250 599.286 0

954302.429 4832493.563 599.286 0

954298.392 4832489.953 599.286 0

testo 5 T5005 0 0.0000 6.0000 50 f9bda380 ffffffff ffffffff 0 PIERO

953203.838 4833256.502

testo 5 T5005 0 0.0000 6.0000 50 f9bda380 ffffffff ffffffff 0 CLEMENTE

953228.608 4833256.502

finefile







--Testo finale prodotto a mano--




Prova di troncamento

topolog 59 505C 0 5 255 255 ffffffff ffffffff ffffffff

953099.45 4833258.39 449.9962

id 94562a9a

id ad05cf55

topolog 6 505C 0 5 255 255 ffffffff ffffffff ffffffff

953036.81 4833296.55 49.46

id 5362d82c

id 4a22524d

id cfd329c4

id 549e2492

id 888d59ec

id d6ee3849

punto 5 932 ffffffff ffffffff ffffffff

953380.34 4832909.1 695.99

punto 5 932 ffffffff ffffffff ffffffff

953925.959 4832598.42 669.65

linea 5 505063 5 255 255 ffffffff ffffffff ffffffff

954298.392 4832489.95 599.29 0

954302.200 4832485.61 599.29 0

954306.295 4832489.25 599.29 0

954302.429 4832493.56 599.29 0

954298.392 4832489.95 599.29 0

testo 5 T5005 0 0.0000 6.0000 50 f9bda380 ffffffff ffffffff 0 PIERO

953203.83 4833256.50

testo 5 T5005 0 0.0000 6.0000 50 f9bda380 ffffffff ffffffff 0 CLEMENTE

953228.61 4833256.50

finefile







Grazie mille in anticipo.





--- Ultima modifica di titino2 in data 2017-10-04 14:49:29 ---

--- Ultima modifica di titino2 in data 2017-10-04 16:23:06 ---
Allegati
Ciao caro, più del risultato che vuoi ottenere, mi interesserebbe vedere il codice che hai scritto per capire dove e perché ti blocchi.

Cya
Grazie in anticipo per la risposta.

Vi prego di perdonare la non correttezza del mio programma e soprattutto la banalità, se non l'ho pubblicato prima è perché mi vergogno di quello che sono riuscito a fare.. vi assicuro che non è banale per mancanza di impegno ma solo per mancanza di capacità.

Come premesso non so da che parte farmi... ho fatto un po di prove... ma veramente non so quale strada e quali "strumenti" utilizzare.Posso solo immaginare che la soluzione risieda nella creazione di qualche classe o qualche funzione... ma sinceramente non saprei come strutturarla.

Ho messo ## nella parte che non ho cancellato e che volevo provare ad usare per poter capire qual'era almeno la riga che contiene le coordinate, ma dopo un po di prove mi pare di capire che questa strada non è quella giusta.

Mi potete aiutare?





#Lettura del file

f=open(r'C:\Prove\Test.txt',"r")

riga1 = f.readline()

print riga1

riga2 = f.readline()

print riga2

riga3 = f.readline()

print riga3

fi=f.readlines()

print "___________________File completo___________________________________"

print fi

#questa parte era per provare a capire quando era la riga che conteneva le

#coordinate visto che la riga delle coordinate inizia sempre con 3 spazi vuoti

##l=len(fi)

##print l

##print type(fi)

##for i in fi:

## print riga1[0:6]

## if riga1[0:2]==" ":

## print "geo"

## else:

## print "diverso"

f.close




Grazie ancora in anticipo
Potresti usare str(stringa[0:2]).isspace() che ti da True se sono tutti spazi, oppure verificare se inizia con degli spazi tramite .startswith(), insomma hai diversi modi per verificare, anche unendo più metodi per maggior sicurezza di non prendere un abbaglio.

Comunque sia, in linea di massima, fai un ciclo che controlli se la riga contiene coordinate o meno (tramite gli spazi), così da scatenare eventi diversi.
if <condizione scelta per gli spazi>:
    <fai delle cose>
else:
    <fai altre cose>
Prova a buttare giù qualche riga di codice.

Cya

P.S. ricorda di usare il pulsante quando posti codice, altrimenti perdi la formattazione.
Buonasera a tutti,
seguendo i consigli ho fatto qualche passo in avanti ma ancora il risultato mi pare acerbo specie perche il file risultante non è ancora perfettamente identico al file di ingresso(eccezion fatta per l'arrotondamento delle coordinate). Vi allego il file di partenza ed il file prodotto dallo script e vedrete che acora non riesco a gestire bene gli a capo.
Sotto vi metto il mio script...
vi prego di darmi consigli e di pazientare se ho commesso qualche o molti errori.
Grazie in anticipo per i consigli
#Lettura del file
f=open(r'C:\ProveTest_Campione.gca',"r")  #Apro il file
fi=f.readlines()  #Leggo il file
coordTR=open('C:\\Prove\\TrovaFS.txt',"w")  #Creo il nuovo file dove riscrivero il file con le coordinate tagliate
#print "___________________Stampo il File completo___________________________________"
##print fi
#print "___________________Fine Stampa File completo__________________________________"
l=len(fi)
for i in range(0,l):
    fin=str(fi)
    if fin.startswith("   ") is True:
#____________Estrazione x y z con sulla base dello .split_________
        r=fin.split("  ")
        print r
        print len(r)
        if len(r)==4:  # per processare --> punto o topolog ['', ' 724345.372', '4234489.913','577.285']

            x=r1          #Estraggo dalla stringa con le coordinate la "x"
            xo=x.strip()    #Elimino eventuali spazi vuoti iniziali
            xf=float(xo)    #Converto in float
            xfr=round(xf,2) #arrotondo la coordinata x alla 2 cifra decimale
            print xo
            print xfr
##            coordTR.write("\n")
            coordTR.write("   "+str(xfr)+"  ")
            y=r2          #Estraggo dalla stringa con le coordinate la "y"
            yo=y.strip()    #Elimino eventuali spazi vuoti iniziali
            print yo
            yf=float(yo)    #Converto in float
            yfr=round(yf,2) #arrotondo la coordinata y alla 2 cifra decimale
            print yo
            print yfr
            coordTR.write(str(yfr)+"    ")
            z=r-1          #Estraggo dalla stringa con le coordinate la "z"
            zo=z.strip()    #Elimino eventuali spazi vuoti iniziali
            print zo
            zf=float(zo)    #Converto in float
            zfr=round(zf,2) #arrotondo la coordinata z alla 2 cifra decimale
            print zo
            print zfr
            coordTR.write(str(zfr))

        elif len(r)==5 and r3=="":  # per processare -->punto o topolog ['', ' 724345.372', '4234489.913', '', '577.285']

            x=r1          #Estraggo dalla stringa con le coordinate la "x"
            xo=x.strip()    #Elimino eventuali spazi vuoti iniziali
            xf=float(xo)    #Converto in float
            xfr=round(xf,2) #arrotondo la coordinata x alla 2 cifra decimale
            print xo
            print xfr
##            coordTR.write("\n")
            coordTR.write("   "+str(xfr)+"  ")
            y=r2          #Estraggo dalla stringa con le coordinate la "y"
            yo=y.strip()    #Elimino eventuali spazi vuoti iniziali
            print yo
            yf=float(yo)    #Converto in float
            yfr=round(yf,2) #arrotondo la coordinata y alla 2 cifra decimale
            print yo
            print yfr
            coordTR.write(str(yfr)+"    ")
            z=r-1          #Estraggo dalla stringa con le coordinate la "z"
            zo=z.strip()    #Elimino eventuali spazi vuoti iniziali
            print zo
            zf=float(zo)    #Converto in float
            zfr=round(zf,2) #arrotondo la coordinata z alla 2 cifra decimale
            print zo
            print zfr
            coordTR.write(str(zfr))
        elif len(r)==6 and r3=="":  # per processare --> linea ['', ' 724345.372', '4234489.913', '', '577.285', '0']

            x=r1          #Estraggo dalla stringa con le coordinate la "x"
            xo=x.strip()    #Elimino eventuali spazi vuoti iniziali
            xf=float(xo)    #Converto in float
            xfr=round(xf,2) #arrotondo la coordinata x alla 2 cifra decimale
            print xo
            print xfr
##            coordTR.write("\n")
            coordTR.write("   "+str(xfr)+"  ")
            y=r2          #Estraggo dalla stringa con le coordinate la "y"
            yo=y.strip()    #Elimino eventuali spazi vuoti iniziali
            print yo
            yf=float(yo)    #Converto in float
            yfr=round(yf,2) #arrotondo la coordinata y alla 2 cifra decimale
            print yo
            print yfr
            coordTR.write(str(yfr)+"    ")
            z=r-1          #Estraggo dalla stringa con le coordinate la "z"
            zo=z.strip()    #Elimino eventuali spazi vuoti iniziali
            print zo
            zf=float(zo)    #Converto in float
            zfr=round(zf,2) #arrotondo la coordinata z alla 2 cifra decimale
            print zo
            print zfr
            coordTR.write(str(zfr)+"   ")
            coordTR.write(r-1)
        elif len(r)<4:  # per processare --> testo ['', ' 724345.372', '4234489.913']

            x=r1          #Estraggo dalla stringa con le coordinate la "x"
            xo=x.strip()    #Elimino eventuali spazi vuoti iniziali
            xf=float(xo)    #Converto in float
            xfr=round(xf,2) #arrotondo la coordinata x alla 2 cifra decimale
            print xo
            print xfr
##            coordTR.write("\n")
            coordTR.write("   "+str(xfr)+"  ")
            y=r2          #Estraggo dalla stringa con le coordinate la "y"
            yo=y.strip()    #Elimino eventuali spazi vuoti iniziali
            print yo
            yf=float(yo)    #Converto in float
            yfr=round(yf,2) #arrotondo la coordinata y alla 2 cifra decimale
            print yo
            print yfr
            coordTR.write(str(yfr)+"    ")
            z=r-1          #Estraggo dalla stringa con le coordinate la "z"
            zo=z.strip()    #Elimino eventuali spazi vuoti iniziali
            print zo
            zf=float(zo)    #Converto in float
            zfr=round(zf,2) #arrotondo la coordinata z alla 2 cifra decimale
            print zo
            print zfr
            coordTR.write(str(zfr))
    else:
        if i<=1:  #per non mettere gli "\n" nell'intestazione
            print "Attributi "+fin
            coordTR.write(str(fin))
        elif i>1:
            print "Attributi "+fin
            coordTR.write("\n"+str(fin))
coordTR.close()
print "__________________Fine_______________________"
f.close

Allegati
Ciao caro, permettimi una considerazione, che non devi vedere come un rimprovero ma un momento di crescita e condivisione.

Anche tralasciando il fatto che ora sono in giro e dallo smarphone non riuscirei ad eseguire il tuo codice, sarebbe meglio isolare solo la parte che ti blocca. Mettere online tutto quel codice per farlo analizzare così com'è, non è a mio avviso la strada giusta, per ché tu impari pochino e i tuoi potenziali interlocutori/risolutori potrebbero non avere voglia e tempo di leggersi tutto il tuo codice.

Se invece proponi alcune righe e solo dove senti l'esigenza di essere aiutato, le possibilità che qualcuno ti aiuti crescono esponenzialmente.

Cya
Ciao Daniele,

concordo con te.. ma visto che sono un autodidatta e probabilmente molto propenso all'errore ho messo tutto il codice(che risulta lungo solo perche è la ripetizione di alcuni if altrimenti sarebbe banale e breve) giusto per avere spunti e suggerimenti.

Comunque il codice a grandi linee produce un file che potrebbe essere quello da me richiesto anche se ancora ci sono degli errori di impaginazione che non so come risolvere (anche per questo ho messo tutto il codice così da darvi la possibilità di vedere dove sbaglio... magari ho sbagliato proprio l'approccio).

Mi permetto di farvi un ulteriore domanda che magari mi aiuta a ricomporre il mio script risolvendo anche gli errori rimasti.

Considerate che io ho delle stringhe contenenti dei valori x,y,z e altro. Questi valori devono essere inseriti all'interno di colonne, ovvero la colonna 9 contiene la x la colonna 10 la y la colonna 11 la z e la 12 altro. Le colonne x y hanno un allineamento a dx mentre la colonna z a sx. Come faccio a stabilire come devo formattare la nuova stringa risultante? Perché come vedete dal mio script io ho provato a giocarmela con gli spazi ma chiaramente come vedete nell'esempio sotto, appena un valore è più lungo o più corto si spagina tutta la serie.

Grazie in anticipo.

714298.370 4832489.910 0.00 0

714302.20 4832485.610 0.00 0

714294.656 4832494.094 577.286 0

714294.660 4832494.090 0.00 0

714298.370 4832489.910 0.00 0



Mi permetto di farvi un ulteriore domanda che magari mi aiuta a ricomporre il mio script risolvendo anche gli errori rimasti.

Considerate che io ho delle stringhe contenenti dei valori x,y,z e altro. Questi valori devono essere inseriti all'interno di colonne, ovvero la colonna 9 contiene la x la colonna 10 la y la colonna 11 la z e la 12 altro. Le colonne x y hanno un allineamento a dx mentre la colonna z a sx. Come faccio a stabilire come devo formattare la nuova stringa risultante? Perché come vedete dal mio script io ho provato a giocarmela con gli spazi ma chiaramente come vedete nell'esempio sotto, appena un valore è più lungo o più corto si spagina tutta la serie.
Intendi nell'output in console?

Potresti "giocartela" in tanti modi, uno di più semplici è con rjust(), in una cosa simile alla seguente (è in Py2 come il tuo script):

data = [
    [714298.370,4832489.910,0.00,0],
    [714302.20,4832485.610,0.00,0],
    [714294.656,4832494.094,577.286,0],
    [714294.660,4832494.090,0.00,0],
    [714298.370,4832489.910,0.00,0]
]

spacing_colonna = max(len(repr(dato)) for row in data for dato in row) + 5 #aggiungo qualche spazio per vederci meglio
for row in data:
    print "".join(repr(dato).rjust(spacing_colonna) for dato in row)
Prova e fammi sapere come va.

Cya


--- Ultima modifica di Daniele aka Palmux in data 2017-10-06 15:03:47 ---
Forse una cosa così è sufficiente?

#!/usr/bin/env python2
import fileinput
for line in fileinput.input(inplace=1, backup='.old'):
    if line[ 0 ] == ' ':
        for coord in line.split():
            print '{:12.2f}'.format(float(coord)),
        print 
    else:
        print line,

Ciao,

THE 🍺-WARE LICENSE (Revision ㊷)
<carlo@🐍.it> wrote this post. As long as you retain this
notice you can do whatever you want with this stuff.
If we meet some day, and you think this stuff is worth it,
you can buy me a 🍺 in return. —㎝
Ciao a tutti...
io da principiante ho risolto così:

xq="            "
[...]
        if len(r)==4:  # per processare --> punto o topolog ['', ' 714298.372', '4832489.913','577.285']
            x=r1          #Estraggo dalla stringa con le coordinate la "x"
            xo=x.strip()    #Elimino eventuali spazi vuoti iniziali
            xf=float(xo)    #Converto in float
            xfr=round(xf,2) #arrotondo la coordinata x alla 2 cifra decimale
            xs=xq[:-len(str(xfr))]+str(xfr)+"0"
[...]
mi dite se ho commesso qualche grave errore?

Più vi chiedo:

nelle stringhe che maneggio il numero degli spazi è variabile, questo mi da fastidio quindi vorrei uniformare il numero degli spazi che vi sono contenuti e lasciare solamente uno spazio tra i vari valori. Per fare questo io ho risolto in maniera molto empirica con dei replace a cascata ma mi sembra una soluzione molto migliorabile. Voi come fareste? Vi metto sotto la stringa originale, la stringa risultante e l'estrazione del mio script.

fi=f.readlines()  #Leggo il file
for i in range(0,l):
    fin=str(fi)
    if fin.startswith("   ") is True:    
        print fin
        rr=fin.replace("  "," ")
        print rr
        rrr=rr.replace("  "," ")
        print rrr
        rrrr=rrr.replace("  "," ")
        print rrrr

        r=fin.split(" ")
Risultati:

#print fin

713077.454 4833258.372 449.9962

#print rr

713077.454 4833258.372 449.9962

#print rrr

713077.454 4833258.372 449.9962

#print rrrr

713077.454 4833258.372 449.9962

Grazie a tutti ancora di tutto.


--- Ultima modifica di titino2 in data 2017-10-11 14:21:52 ---


Pagina: 1



Esegui il login per scrivere una risposta.