2

Pythonでファイルから行ごとに読み取り、解析する方法は?

私はpythonが初めてです。

入力の最初の行は、シミュレーションの数です。次の行は行数 (x) で、その後に 1 つのスペースが続き、その後に列数 (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
4

2 に答える 2

7

エラーは多数あります。これまでに見つけたエラーは次のとおりです。

  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()できます。" "さらに良いことに、それらを 1 行にまとめます。

    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. 代わりに「myMap cls.myMap」を作成しますvariable but then ignore it by referring to

  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)
于 2012-09-26T23:01:42.977 に答える
1

Martijn Pieters はコードを改善する方法を非常にうまく説明していますが、私はまったく別のアプローチ、つまりParcon などのMonadic Parser Combinatorライブラリを使用することを提案します。これにより、文脈自由文法を超えて、現在の解析プロセスによって抽出された情報に基づいて実行時にパーサーを簡単に変更できます。

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

最初は、モナドのすべてのものと同様に、少し頭がおかしいです。しかし、表現の柔軟性と簡潔さは、モナドについて学習するために投資する価値があります。

于 2012-09-27T01:03:13.333 に答える