Как читать построчно и анализировать файл в python?

Как читать построчно и анализировать файл в python?

Я новичок в питоне.

Первая строка ввода — это количество симуляций. Следующая строка — это количество строк (x), за которым следует один пробел и за которым следует количество столбцов (y). Следующая группа из y строк будет содержать x символов, с одной точкой ('.'), представляющей собой пробел, и одной заглавной буквой «A», представляющей начального агента.

Мой код получил ошибку

Traceback (most recent call last):
    numSims = int (line)
TypeError: int() argument must be a string or a number, not 'list'

Спасибо за вашу помощь.

Ввод.txt

2   --- 2 simulations
3 3  -- 3*3 map
.A.  --map
AA.
A.A
2 2  --2*2 map
AA  --map
.A
def main(cls, args):
    numSims = 0
    path = os.path.expanduser('~/Desktop/input.txt') 
    f = open(path) 
    line = f.readlines() 
    numSims = int (line)
    print numSims
    k=0
    while k < numSims:
        minPerCycle = 1
        row = 0
        col = 0
        xyLine= f.readLines()
        row = int(xyLine.split()[0]) 
        col = int(xyLine.split()[1])
        myMap = [[Spot() for j in range(col)] for i in range(row)] 
        ## for-while
        i = 0
        while i < row:
            myLine = cls.br.readLines()
            ## for-while
            j = 0
            while j < col:
                if (myLine.charAt(j) == 'B'):
                    cls.myMap[i][j] = Spot(True)
                else:
                    cls.myMap[i][j] = Spot(False)
                j += 1
            i += 1

Для Spot.py

Spot.py

class Spot(object):
isBunny = bool()
nextCycle = 0
UP = 0
RIGHT = 1
DOWN = 2
LEFT = 3
SLEEP = 4

def __init__(self, newIsBunny):
    self.isBunny = newIsBunny
    self.nextCycle = self.UP

person Mike    schedule 26.09.2012    source источник
comment
Итак, что не так с приведенным кодом?   -  person Gareth Latty    schedule 27.09.2012
comment
Вы должны попробовать модуль atpy — он легко считывает и анализирует столбцы, и все, что вам нужно сделать, это указать тип файла (в данном случае ascii) и разделитель.   -  person cosmosis    schedule 27.09.2012
comment
@Mike: что касается вашего класса Spot ... Я думаю, вы все еще неправильно понимаете, как работают классы Python. Пожалуйста, не пытайтесь подделывать объявления типов для переменных, они не нужны и не могут предотвратить, например. это: s = Spot(7); s.isBunny = 'joe'   -  person pillmuncher    schedule 27.09.2012


Ответы (2)


Ваши ошибки многочисленны, вот те, которые я нашел до сих пор:

  1. Строка numSims = (int)line не делает того, что вы думаете. В Python нет приведения C, вместо этого вам нужно вызывать тип int:

    numSims = int(line)
    

    Вы усугубляете эту ошибку позже, используя написание Int в верхнем регистре:

    row = (Int)(xyLine.split(" ")[0])
    col = (Int)(xyLine.split(" ")[1])
    

    Аналогичным образом исправьте их:

    row = int(xyLine.split()[0])
    col = int(xyLine.split()[1])
    

    и поскольку по умолчанию для .split() используется разделение на пробелы, вы можете не указывать аргумент " ". А еще лучше объединить их в одну строку:

    row, col = map(int, xyLine.split())
    
  2. Вы никогда не увеличиваете k, поэтому ваш цикл while k < numSims: будет продолжаться вечно, поэтому вы получите ошибку EOF. Вместо этого используйте цикл for:

    for k in xrange(numSims):
    

    Вам не нужно использовать while где-либо в этой функции, все они могут быть заменены циклами for variable in xrange(upperlimit):.

  3. Строки Python не имеют метода .charAt. Вместо этого используйте [index]:

    if myLine[j] == 'A':
    

    но поскольку myLine[j] == 'A' является логическим тестом, вы можете упростить создание экземпляра Spot() следующим образом:

    for i in xrange(row):
        myLine = f.readLine()
        for j in xrange(col):
            cls.myMap[i][j] = Spot(myLine[j] == 'A')
    
  4. В Python нет необходимости так часто инициализировать переменные. Вы можете получить большую часть строк numSims = 0 и col = 0 и т. д., если присваиваете новое значение следующей строке.

  5. Вместо этого вы создаете «myMapvariable but then ignore it by referring tocls.myMap».

  6. Здесь нет обработки множественных карт; последняя карта в файле перезапишет любую предыдущую карту.

Переписанная версия:

def main(cls, args):
    with open(os.path.expanduser('~/Desktop/input.txt')) as f:
        numSims = int(f.readline())
        mapgrid = []
        for k in xrange(numSims):
            row, col = map(int, f.readline().split())  
            for i in xrange(row):
                myLine = f.readLine()
                mapgrid.append([])
                for j in xrange(col):
                    mapgrid[i].append(Spot(myLine[j] == 'A'))
         # store this map somewhere?
         cls.myMaps.append(mapgrid)
person Martijn Pieters    schedule 26.09.2012
comment
Ничего себе, это удивительно тщательный анализ сомнительного кода. . . хорошая работа! - person ernie; 27.09.2012
comment
Извините, я ошибся, назвав переменную map. Исправлено. - person Martijn Pieters; 27.09.2012

В то время как Martijn Pieters делает очень хорошую работу, объясняя, как можно улучшить ваш код, я предлагаю совершенно другой подход, т.е. используя библиотеку Monadic Parser Combinator, например, например. Parcon. Это позволяет вам выйти за рамки контекстно-свободных грамматик и легко модифицировать ваш синтаксический анализатор во время выполнения на основе информации, извлеченной текущим процессом синтаксического анализа:

from functools import partial
from parcon import (Bind, Repeat, CharIn, number, End,
                    Whitespace, ZeroOrMore, CharNotIn)

def array(parser, size):
    return Repeat(parser, min=size, max=size)

def matrix(parser, sizes):
    size, sizes = sizes[0], sizes[1:]
    return array(matrix(parser, sizes) if sizes else parser, size)

comment = '-' + ZeroOrMore(CharNotIn('\n')) + '\n'

sims = Bind(number[int],
            partial(array,
                    Bind(number[int] + number[int],
                         partial(matrix,
                                 CharIn('.A')['A'.__eq__])))) + End()

text = '''
2   --- 2 simulations
3 3  -- 3*3 map
.A.  --map
AA.
A.A
2 2  --2*2 map
AA  --map
.A
'''

import pprint
pprint.pprint(sims.parse_string(text, whitespace=Whitespace() | comment))

Результат:

$ python numsims.py
[[False, True, False], [True, True, False], [True, False, True]]
[[True, True], [False, True]]

Поначалу это немного сбивает с толку, как и все монадические вещи. Но гибкость и лаконичность выражения стоят времени, потраченного на изучение монад.

person pillmuncher    schedule 27.09.2012