Konwerter

0

Witam,

Proszę o pomoc przy budowie konwertera plików, konwerter pobiera (czyta linijka po linijce) dane z pliku. Dane w pliku są z reguły w czterech kolumnach jednakże zdarza się także że brak jest danych w kolumnie:

182 -21.21320343 0.000 -21.21320343
183 -27.71638680 0.000 -11.48050308
184 -30.00000000
185 -27.71638680 0.000 11.48050308
186 0.000 0.000
187 0.000 0.000 -30.00000000
188 -25.90019989 -10.70466328 -10.70466328

Następnie dane są zapisywanie w formacie:
*NODE
1,2,3,4

Proszę o pomoc jak poprawić ten kod aby w przypadku braku danych w kolumnie wejściowej program przypisywał zawsze 0.
Obecnie zakończenie czytania linii jest wystąpienie słowa "$EndNodes" jak mogę poprawić aby nastąpiło zakończenie czytania jak wystąpi tylko początek np. "$" (występują różne kombinacje np. $EndNodes. $EndElement ...)?

#----read and write until '$EndNodes----------------------
ss=""
while True:
s=fi.readline()
s1=s.strip() #chomp
if (s1 == "$EndNodes" ):
break
s2=s1.split() #split with space
fo.write("%d,%10e,%10e,%10e\n" % (int(s2[0]) , float(s2[1]) , float(s2[2]) , float(s2[3])))

Pozdrawiam

0

Na kilku forach jednocześnie, z rozmachem :P.

s = "182 -21.21320343 0.000 -21.21320343"
t = "182 0.000 -21.21320343"
u = "182 0.000 "
convert_to_list = lambda string: [float(g) for g in string.split()]+[0.0 for i in range(4-len(string.split()))]
s1 = convert_to_list(s)
t1 = convert_to_list(t)
u1 = convert_to_list(u)
print(s1)
print(t1)
print(u1)

Funkcję lambda zapisz sobie przed pętlą while. A następnie tak jak nazwałeś te funkcję, w moim przypadku "convert_to_list(TwojaZmienna)" wywołujesz w przypisaniu, i powinno działać. Od razu funkcja ci zamienia wszystko na float'a więc oszczędzasz sobie rzutowania typu "float(s2[1])" wystarczy ci jedno rzutowanie na int, pozostałe na przykład s2[1].

@Edit:
Oczywiście ta funkcja nie ma prawa wiedzieć w którym miejscu ci brakuje danych w kolumnie, sam tego nie widzę po przykładzie, więc zawsze uzupełni na końcu zerami :).

@Edit2:
A zakończenie to prosta funkcja string.startswith("COS")
Czyli w twoim przypadku:

if s1.startswith("$"):
    [reszta instrukcji]

Drugi sposób używać "Magii pythona" w stringach:

if s1[0] == "$":
    [reszta instrukcji]

Albo inaczej indeksując zakres:

if s1[:1] == "$":
    [reszta instrukcji]

Kontrolując na którym znaku ma kończyć (indeksie od zera, wyłączając wskazany), można sprawdzić tym sposobem dłuższy początek niż jeden znak. I jest to chyba najlepsza metoda, działanie na fragmencie string'a zamiast na całym (gdy potrzebujesz kilka znaków, gdy jeden to sposób powyższy).

Ogólnie w twoim przypadku proponowałbym przebudować while'a aby sprawdzał ten warunek, a później dać do niego else gdy przestanie się wykonywać. Bo rozumiem że pytanie o porównanie jest w celach optymalizacji konwersji - by była szybsza ;p.

1 użytkowników online, w tym zalogowanych: 0, gości: 1