2016-07-02 8 views
0

Mein Ziel setzen, diesen Text in einer Text-Datei (alle in 1 Zeile) zu transformieren:Textdatei zu lesen und einige Zeichen in Listen

a b s d p 
5 4 3 3 2 
.......... 
....pp..s. 
........s. 
.a......s. 
.a.....b.. 
.a.....b.. 
.a.....b.. 
.a.ddd.b.. 
.......... 
.......... 

und einen Ausgang hat: [[ 'a', 'b' , 's', 'd', 'p'], [5, 4, 3, 3, 2]] Aber ich folgende Fehlermeldung erhalten: ship_characters.append (str (char)) Memory

Hier ist mein Code:

def read_ship_data(game_file): 

    ship_characters = [] 
    ship_sizes = [] 

    game = open(game_file, 'r') 
    for line in game: 
     for char in line: 
      while char != '.': 
       if char.isalpha(): 
        ship_characters.append(str(char)) 
       elif char.isnumeric(): 
        ship_sizes.append(int(char)) 
    return [ship_characters , ship_sizes] 
+2

'während char =‚‘:' Endlosschleife eingehenden. Ich bin mir nicht sicher, ob ich die Frage verstehe. – Simon

+0

Warum würde die While-Anweisung zu einer Endlosschleife führen? Sollte es nicht beim ersten "." – rannoudanames

+0

Wollen Sie nur Zeichen in den ersten beiden Zeilen im Ergebnis? – wwii

Antwort

0

Andere haben den Grund für den Speicherfehler identifiziert: eine Endlosschleife.

Unter der Annahme, dass Sie die ersten zwei Zeilen aus der Datei benötigen hier ist ein besserer Weg, es zu tun:

def read_ship_data(game_file): 
    with open(game_file) as game_file: 
     return [line.split() for line in (next(game_file), next(game_file))] 

Dies liest nur die ersten zwei Zeilen aus der Datei (mit next(file)) und teilt die Linien in einem Listenverständnis, das von der Funktion zurückgegeben wird.

Wenn Sie die Werte aus der zweiten Zeile auf ganze Zahlen konvertieren müssen:

def read_ship_data(game_file): 
    with open(game_file) as game_file: 
     return [next(game_file).split(), [int(x) for x in next(game_file).split()]] 
+0

Das funktioniert sehr gut! – rannoudanames

+0

Ich bin jedoch verwirrt darüber, wie das Programm weiß, wo zu stoppen ist. Mein erster Gedanke war, dass das Programm beim "." Aufhören würde. Aber hier erwähnen Sie es nicht. Würde es dir etwas ausmachen, zu erklären? @mhawke – rannoudanames

+0

@ GabrielJoséLabrousse: Der Code liest die Datei Zeile für Zeile, nicht ein Zeichen gleichzeitig. Rufen Sie 'next()' in einer geöffneten Textdatei auf, wird eine Zeile zurückgegeben. Wenn Sie es erneut aufrufen, wird die nächste Zeile zurückgegeben. Da die Daten, die Sie präsentieren, zeilenorientiert sind, können Sie einfach jede Zeile lesen und wie gezeigt teilen. Daher ist das '.' nicht erforderlich. – mhawke

0

Sie haben gerade eine Endlosschleife für das erste Zeichen und hängen es an Ihre Liste an. Ihre While-Schleife wird nie aufhören, da 'a' != '.' immer wahr ist.

def read_ship_data(game_file): 
    with open(game_file, 'r') as file: 
     ship_characters = file.readline().strip().split() 
     ship_sizes = file.readline().strip().split() 
     ship_sizes = [int(i) for i in ship_sizes] 

    return [ship_characters, ship_sizes] 
+0

Warum denkst du, dass das OP nur zwei Zeilen haben will? – wwii

+1

@wwii möchte er bei der "." Charakter. Und sieh dir die Ausgabe an, die er will. – Simon

+0

Ich verstehe nicht, was das Programm zu stoppen sagt.Das gibt mir das Ergebnis, das ich erwarte. Was ist die Logik, die Sie verwenden, verwenden Sie nicht das '.' – rannoudanames

0

Du Looping für immer:

Wenn Sie nur die zwei ersten Zeilen wollen und das Format wird sich nie ändern, sollten Sie etwas einfacher verwenden

for char in line: 
    while char != '.': 
     if char.isalpha(): 
      ship_characters.append(str(char)) 
     elif char.isnumeric(): 
      ship_sizes.append(int(char)) 

Sie setzen den Wert von char für eine Iteration durch line, dann bleiben Sie in Ihrer while Schleife, solange dieser Wert nicht ist - aber keine wo in der while Schleife ändern Sie den Wert von char. Das geschieht außerhalb der while-Schleife, wenn es zum nächsten Zyklus in der for-Schleife kommt.

Es scheint, als ob Sie die while Schleife entfernen und stattdessen if char != '.': vielleicht haben möchten?

Edit: Eigentlich gibt es keine Notwendigkeit '.' separat zu fangen - Sie testen bereits isalpha() und isnumeric() mit - beachten Sie, dass Sie isdigit() möchten, wenn Sie in Python 2.x sind und nicht die Verwendung von Unicode - und ein '.' Falsch zurück auf beides. So können Sie es so machen:

+0

Sie sollten eine Lösung mit '' 'if char == 'hinzufügen.' : continue''' als Ersatz für die Anweisung '' while'''. – wwii