如何在python中逐行读取和解析文件?

如何在python中逐行读取和解析文件?,python,parsing,readline,Python,Parsing,Readline,如何在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' 谢谢

如何在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'
谢谢你的帮助

Input.txt

2   --- 2 simulations
3 3  -- 3*3 map
.A.  --map
AA.
A.A
2 2  --2*2 map
AA  --map
.A

你的错误很多,以下是我迄今为止发现的错误:

  • numSims=(int)行
    的作用与您认为的不同。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())
    
  • 您从不增加
    k
    ,因此当k循环时,您的
    将永远继续,因此您将得到一个EOF错误。将
    用于
    循环:

    for k in xrange(numSims):
    
    您不需要使用
    ,而
    在该函数中的任何位置,它们都可以替换为xrange(上限)中变量的
    循环

  • 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')
    
  • 在Python中不需要太多地初始化变量。如果在下一行指定新值,则可以获得大多数
    numSims=0
    col=0
    行等

  • 您创建了一个“myMap
    变量,但通过引用
    cls.myMap`忽略它

  • 这里没有多表映射的处理;文件中的最后一个映射将覆盖前面的任何映射

  • 重写版本:

    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)
    
    在解释如何改进代码时,我建议使用一种完全不同的方法,即使用库,例如。这允许您超越上下文无关语法,并根据当前解析过程提取的信息在运行时轻松修改解析器:

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

    一开始它有点让人心烦意乱,就像所有一元的东西一样。但是,表达式的灵活性和简洁性非常值得花时间学习monad。

    那么,给定的代码有什么问题吗?您应该尝试atpy模块-它可以轻松读入和解析列,您所要做的就是指定文件类型(本例中为ascii)和分隔符。@Mike:关于您的Spot类。。。我认为关于Python类的工作方式,您仍然完全错了。请不要试图为变量伪造类型声明,它们既不需要也无法阻止,例如:
    s=Spot(7);s、 isBunny='joe'
    哇,这是对一些可疑代码的惊人透彻的分析。干得好!很抱歉,这是我的错误,我将变量命名为
    map
    。更正。
    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]]