2016-08-01 45 views
1

Ich kann nicht damit umgehen, eine Liste von Strings auf eine Liste von Floats aufzuteilen. Ich öffne eine Textdatei (.vol, aber es enthält nur Text), die letzte Zeile ist eine extrem lange Reihe von Zahlen.Splitten einer String-Liste in Floats - Speicherfehler

Params1 437288,59375000 102574,20312500 -83,30001831
Params2 437871,93750000 104981,40625000 362,10000610
Params3 0,00000000
Params4 342 1416 262
Params5 583,34375000 2407,19995117 445,40002441
Params6 20,00000000
Params7 1,70000005
Params8 126.879.264
Werte:
0.25564435 0. 462.439 0,1365 0,1367 26,00000000 (usw., gibt es Millionen von Werten sind)

Da es sich um eine 10-Zeile einer txt-Datei ist, ich sie in eine Liste laden, indem Sie:

with open('d:/py/LAS21_test.vol') as f: 
txt = [] 
for line in f: 
    txt.append(line) 

Und dann versuche ich, konvertieren, dass aus der Zeichenfolge zu Schwimmern von:

A = [] 
for vx in txt[9]: 
    try: 
     A.append(float(vx)) 
    except ValueError: 
     pass 
print (A[0:20]) 
print (txt[9][0:20]) 

me Dieses geben, dass die Ergebnisse:

[0.0, 2.0, 5.0, 5.0, 6.0, 4.0, 4.0, 3.0, 5.0, 0.0, 4.0, 6.0, 2.0, 4.0, 3.0, 9.0, 0.0, 1.0, 3.0, 6.0] 
0.25564435 0.462439 

Was würde ich gerne haben eine Liste von richtig Schwimmer aufgeteilt, wie:

[0.25564435, 0.462439] 

I verwendet except ValueError Whitespaces zu verzichten - wenn nur float(txt[9]) mit I-Wert Fehler. Zweite Ausgabe: Ich kann txt[9].split nicht verwenden, weil dann bekomme ich den "Speicherfehler".

Wie kann ich dies in eine Liste von Schwimmern richtig konvertieren?

+0

Sie sollten die Eingabedatei Inhalt hinzufügen, um sie leichter zu verstehen. – AntoineB

+0

Nur hinzugefügt, danke. –

Antwort

0

Wenn ich es richtig verstehe, können Sie nicht txt [9] .split() machen und es wie folgt abbilden: map(float, txt[9].split()) weil der txt [9] zu groß ist.

können Sie diesen Generator versuchen:

def float_generator(txt): 
     x = '' 
     for c in txt: 
      if c != ' ': 
       x += c 
      else: 
       out = float(x) 
       x = '' 
       yield(out) 

for i in float_generator(txt[9]): 
     print (i) 
0

Ihr Problem hier (wie in den Kommentaren erwähnt) ist:

1) Im ersten Fall Sie indizieren in die Zeichenfolge versuchen, bevor Sie es geteilt und Sie versuchen, Räume zu Schwimmern konvertieren (daher der)

2) Im zweiten Fall sind wahrscheinlich zu viele Nummern in der Liste und Sie füllen Ihren Speicher mit einer riesigen Liste von großen Strings (daher die MemoryError).

Versuchen Sie, diese zuerst:

numbers = [float(s) for s in txt[9].split(' ')] 

Dies sollte Ihnen eine Liste von Zahlen geben. Wenn dies auch ein MemoryError verursacht, werden Sie über die Schnur von Hand zu durchlaufen haben:

numbers = [] 
numstring = [] 
for s in txt[9] 
    # Reached a space 
    if s == ' ': 
     numbers.append(float(numstring)) 
     numstring = [] 
    else: 
     numstring.append(s) 

So viel langsamer sein wird, aber auf dem Gedächtnis speichern.