python函数读取文件和正则表达式

python函数读取文件和正则表达式,python,Python,我最近开始学习Python def bacafile(): f=open('A157038027_S2TIB_2b.txt','r') lines=f.read().split(',') while lines!='': lines=f.readline for i in (len(f)): temp (i)= open ('A157038027_S2TIB_2b.txt','r') te

我最近开始学习Python

def bacafile():
    f=open('A157038027_S2TIB_2b.txt','r')

    lines=f.read().split(',')

    while lines!='':
        lines=f.readline
        for i in (len(f)):
            temp (i)= open ('A157038027_S2TIB_2b.txt','r')
            temp(i)=f
            f=temp(i)

            if (temp(i))==("[0-9]"):
                print(temp(i),"integer number")
            elif(temp(i))== ("([-+]?([0-9]*\.[0-9]+|[0-9]+"):
                print(temp(i),"floating number")
            elif (temp(i))== ("[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?"):
                print (temp(i),"exponential number")
            else:
                print ("not number")
    print(lines)
    f.close()

但是,当函数执行时,我收到错误,“Can not assign to function call”这意味着什么,以及如何修复它?

此代码有几处错误,但您收到的错误消息来自一行,如
temp(I)=……
temp(i)
是函数调用的结果(使用参数
i
调用函数
temp
),并且不能将该结果分配给任何对象
a[i]=b
有效(分配a的第i个元素),但
a(i)=b
无效

以下是一些其他错误的地方:

  • lines=f.readline
    :f.readline是一个函数,但没有
    ()
    ,您实际上没有调用该函数
  • 您不需要readline,因为您已经用
    lines=f.read().split(',')读取了文件。
  • 第一行出现语法错误:在
    def bacfile()之后需要一个分号
下面是编写这部分代码的更好方法:

def bacafile():
    with open('A157038027_S2TIB_2b.txt','r') as f:
        for line in f:
            # do something with the line
            print line

此代码有几处错误,但您收到的错误消息来自一行,如
temp(i)=…
temp(i)
是函数调用的结果(使用参数
i
调用函数
temp
),并且不能将该结果分配给任何对象
a[i]=b
有效(分配a的第i个元素),但
a(i)=b
无效

以下是一些其他错误的地方:

  • lines=f.readline
    :f.readline是一个函数,但没有
    ()
    ,您实际上没有调用该函数
  • 您不需要readline,因为您已经用
    lines=f.read().split(',')读取了文件。
  • 第一行出现语法错误:在
    def bacfile()之后需要一个分号
下面是编写这部分代码的更好方法:

def bacafile():
    with open('A157038027_S2TIB_2b.txt','r') as f:
        for line in f:
            # do something with the line
            print line

错误会准确地告诉您哪一行出错。我注意到,在你的代码中,第一个是:

这句话说:

  • 查找名为
    temp
  • 查找名为
    i
  • 调用名为
    temp
    的对象(预期为函数或其他可调用对象),向其传递一个参数,该参数是名称
    i
  • 将计算
    =
    运算符右侧表达式的结果分配给前面的函数调用
  • (我不会解释右边,因为我们已经解决了这个问题)

  • 赋值的左侧必须是变量(或字段或集合中的条目)的名称。它不能是函数调用或其他任意表达式。

    错误会准确地告诉您哪一行出错。我注意到,在你的代码中,第一个是:

    这句话说:

  • 查找名为
    temp
  • 查找名为
    i
  • 调用名为
    temp
    的对象(预期为函数或其他可调用对象),向其传递一个参数,该参数是名称
    i
  • 将计算
    =
    运算符右侧表达式的结果分配给前面的函数调用
  • (我不会解释右边,因为我们已经解决了这个问题)

  • 赋值的左侧必须是变量(或字段或集合中的条目)的名称。它不能是函数调用或其他任意表达式。

    因为答案已经给出。让我们从更一般的意义上讨论如何改进代码

    首先要清楚:bakafile不是一个非常具有描述性的函数名。目的是亲吻,并能够理解纯粹基于标题的功能

    此函数似乎试图解析一个类似csv的文件,该文件包含十进制数、带指数或不带指数的浮点数,然后打印所有行<代码>解析和打印可能会成为一个好名字

    其次,分而治之。添加简单函数可以大大提高可读性

    第三个神奇常量,文件名应该是参数或常量

    第四,python引入了带有
    关键字的
    ,简化了io

    示例结果(解释我认为您正在做的事情):


    因为答案已经给出了。让我们从更一般的意义上讨论如何改进代码

    首先要清楚:bakafile不是一个非常具有描述性的函数名。目的是亲吻,并能够理解纯粹基于标题的功能

    此函数似乎试图解析一个类似csv的文件,该文件包含十进制数、带指数或不带指数的浮点数,然后打印所有行<代码>解析和打印可能会成为一个好名字

    其次,分而治之。添加简单函数可以大大提高可读性

    第三个神奇常量,文件名应该是参数或常量

    第四,python引入了带有
    关键字的
    ,简化了io

    示例结果(解释我认为您正在做的事情):

    当你说
    temp(i)=…
    我不能说如何修复它,因为我不知道你想实现什么。当你说
    temp(i)=…
    我不能说如何修复它,因为我不知道你想实现什么。
    import re
    
    # compiling ahead of time improves performance, and allows you to
    # name what your regex does
    int_re = re.compile(r'^[-+]?[0-9]+$')
    float_re = re.compile(r'^[-+]?[0-9]*\.[0-9]+$')
    exp_re = re.compile(r'^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$')
    
    def is_int(string):
        return int_re.search(string) != None
    
    def is_float(string):
        return float_re.search(string) != None
    
    def is_exponent(string):
        return exp_re.search(string) != None
    
    def parse(item):
        if is_int(item):
            print("integer number: %d" % int(item))
        elif is_float(item):
            print("floating number: %.3f" % float(item))
        elif is_exponent(item):
            print("exponential number: %e" % float(item))
    
    def parse_and_print(filename):
        with open(filename, 'r') as f:
            # read all lines
            for line in f:
                for item in line.split(','):
                    item = item.strip()      # remove whitespace
                    parse(item)              # parse individual items
    
            # reset the read position in the file to begin
            f.seek(0)
    
            # print all lines afterwards
            for line in f:
                print(line)
    
    parse_and_print('A157038027_S2TIB_2b.txt')