Forum
>>
Principianti
>>
Non so da che parte farmi aiuto
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da titino2 |
2017-10-04 14:49:08 - Non so da che parte farmi aiuto
|
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 --- |
|
Scritto da Daniele aka Palmux |
2017-10-04 16:35:53 - Re: Non so da che parte farmi aiuto
|
Ciao caro, più del risultato che vuoi ottenere, mi interesserebbe vedere il codice che hai scritto per capire dove e perché ti blocchi.
Cya |
|
Scritto da titino2 |
2017-10-04 18:03:58 - Re: Non so da che parte farmi aiuto
|
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 |
|
Scritto da Daniele aka Palmux |
2017-10-04 18:39:44 - Re: Non so da che parte farmi aiuto
|
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. |
|
Scritto da titino2 |
2017-10-05 14:14:20 - Re: Non so da che parte farmi aiuto
|
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 |
|
Scritto da Daniele aka Palmux |
2017-10-05 16:56:36 - Re: Non so da che parte farmi aiuto
|
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 |
|
Scritto da titino2 |
2017-10-06 09:11:13 - Re: Non so da che parte farmi aiuto
|
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 |
|
Scritto da Daniele aka Palmux |
2017-10-06 14:41:19 - Re: Non so da che parte farmi aiuto
|
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 --- |
|
Scritto da ㎝ |
2017-10-06 21:29:15 - Re: Non so da che parte farmi aiuto
|
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 ㊷):
<㎝🐌🐍.🇮🇹> 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. -- ㎝ |
|
Scritto da titino2 |
2017-10-11 14:21:08 - Re: Non so da che parte farmi aiuto
|
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.