2016-07-02 30 views
0

にいくつかの文字を入れて私の目標は、テキストファイル(すべて1行で)でこのテキストを変換することです:テキストファイルを読み込み、リスト

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

、出力を持っている:[[「A」、「B」 、 'S'、 'D'、 'P']、[5、4、3、3、2]] しかし、私は次のエラーを取得する: ship_characters.append(STR(CHAR)) MemoryError

ここに私のコードです:

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

'='無限ループ入ってきます。私はその質問を理解しているか分からない。 – Simon

+0

なぜwhile文が無限ループにつながるのでしょうか?それは最初に止まらなければならない '。 – rannoudanames

+0

結果の最初の2行にある文字だけが必要ですか? – wwii

答えて

0

他の人は、メモリエラーの理由を特定しました:無限ループ。ラインを

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))] 

これは単なる(next(file)で)ファイルの最初の2行を読み込み、および分割:

あなたはここでそれを行うには良い方法があるファイルの最初の2行が必要と仮定すると、関数から返されたリスト内包表記に含まれます。

あなたは、整数の2番目の行から値を変換する必要がある場合:!「」文字しばらく

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

これはとてもうまく動作します! – rannoudanames

+0

しかし、私はどこでプログラムを停止するのか分かりません。私の最初の考えは、プログラムが '。'で止まるということでした。しかし、ここではそれについて言及していません。あなたは説明してもらえますか? @mhawke – rannoudanames

+0

@GabrielJoséLabrousse:コードは、一度に1文字ずつではなく、一度に1行ずつファイルを読み込みます。開いているテキストファイルで 'next()'を呼び出すと、1行が返されます。もう一度呼び出すと次の行が返されます。あなたが提示したデータは行指向であるため、各行を読み、それを分割して表示することができます。したがって '.'は必須ではありません。 – mhawke

0

今、最初の文字を無限ループしてリストに追加しています。 'a' != '.'が常に真であるため、whileループは停止しません。

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

あなたがの値を設定します。あなたは永遠にループしている

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

なぜOPは2つのラインだけを望んでいると思いますか? – wwii

+1

@wwii彼は '。'に立ち寄りたいです。キャラクター。そして彼が望む出力を見てください。 – Simon

+0

私はプログラムを止めるように指示するものは理解していません。これは私に期待した結果を与える。あなたに与えられた論理は何ですか? ' – rannoudanames

0

:あなたはちょうど2つの最初の行をしたいとフォーマットが変更されることはありません場合は

、あなたはシンプルなものを使用する必要がありますを1回の繰り返しでlineまで実行した場合、その値が'.'でない限り、whileループにとどまりますが、whileループでは01の値を変更します。これはwhileループの外側で起こり、forループの次のサイクルになります。

whileループを削除して、その代わりにif char != '.':があるようですか?

編集:実際には、別途'.'をキャッチする必要はありません - あなたはすでにisalpha()isnumeric()を使用してテストしている - あなたはユニコードを使ってPython 2.xとではないにしている場合は、isdigit()を望んでいることに注意してください - と'.' Falseを返しますのそれらの両方。だからこのようにすることができます:

+0

'' 'if char == '。' 'を使って解を加えるべきです。 :continue'''を '' while'''ステートメントの代わりに使用します。 – wwii

関連する問題