2016-07-02 2 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» , 'с', 'd', 'р'], [5, 4, 3, 3, 2]] Но я получаю следующее сообщение об ошибке: ship_characters.append (ул (символ)) 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

'то время как обугленная! = '':' Бесконечной Incoming петли. Я не уверен, что понимаю этот вопрос. – Simon

+0

Почему утверждение while приведет к бесконечному циклу? Если он не остановится на первом «.». – rannoudanames

+0

Вам нужны только символы в первых двух строках в результате? – wwii

ответ

0

Другие идентифицировали причину ошибки памяти: бесконечный цикл.

Предполагая, что вы требуете первые 2 строки из файла здесь это лучший способ сделать это:

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

Это просто читает первые 2 строки из файла (с next(file)) и разбивает строки в понимании списка, которое возвращается из функции.

Если необходимо преобразовать значения из второй строки в целые числа:

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: код читает файл по одной строке за раз, а не по одному символу за раз. Вызов 'next()' в открытом текстовом файле возвращает одну строку. Вызов его снова вернет следующую строку. Поскольку данные, которые вы представляете, ориентированы на линию, можно просто прочитать каждую строку и разделить ее, как показано. Таким образом, '.' не требуется. – mhawke

0

Прямо сейчас вы бесконечно зацикливаетесь на первом символе и добавляете его в свой список. Ваш цикл while никогда не остановится, так как 'a' != '.' всегда будет правдой.

Если вы просто хотите, 2 первых строк и формат не изменится, вы должны использовать что-то более простое:

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 хочет только две строки? – wwii

+1

@wwii он хочет остановиться на '.' персонаж. И посмотрите на результат, который он хочет. – Simon

+0

Я не понимаю, что говорит программе остановиться.Это дает мне результат, который я ожидаю. Какова логика, если вы не используете «.». – rannoudanames

0

Вы зацикливание:

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

Вы можете установить значение char за одну итерацию через line, то вы остаетесь в своем цикле while, если это значение не '.' - но нет, где в цикле while вы меняете значение char. Это происходит за пределами цикла while, когда он переходит к следующему циклу цикла for.

Похоже, вы хотите удалить петлю while, и вместо этого есть if char != '.':?

Edit: На самом деле нет никакой необходимости, чтобы поймать '.' отдельно - вы уже тестирование с использованием isalpha() и isnumeric() - обратите внимание, что вы хотите isdigit(), если вы в Python 2.x, а не с помощью юникода - и '.' возвращает значение False на оба из них. Таким образом, вы можете сделать это следующим образом:

for char in line: 
    if char.isalpha(): 
     ship_characters.append(str(char)) 
    elif char.isnumeric(): 
     ship_sizes.append(int(char)) 
    else: 
     pass 
     #do something for non-letter and non-number values if you want 
+0

Вы должны добавить решение с '' 'if char == '.' : continue''' в качестве замены оператора '' while'''. – wwii

Смежные вопросы