python中的表有一些错误不确定原因

2024-04-19 23:24:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些关于python的“技术”和基本函数的问题。在

我有一张这样的桌子:

Name,Gender,Age,Salary,Height
Menny,   M,    1,   1,   1
James,   J,    2,   2,   2
Sami,    S,    3,   3,   3


class Table:

def __init__(self,path,sep):
    try:
        f = open(path, "r")
        read_file = f.read()
        f.close()
    except:
        print "cannot create a table from this file"
        return

    table = read_file.split("\n")
    for i in range (len(table)):
        table[i] = table[i].split(sep)

    if len(table) > 0:
        for i in range(len(table[0])):
            if table[0][i] in table[0][0:i]:
                raise ValueError

        row_names = []
        for i in range(1,len(table)):
            if len(table[i]) != len(table[0]):
                raise ValueError
            if table[i][0] in row_names:
                raise ValueError
            row_names.append(table[i][0])

现在我想使用函数: 1知道有多少个细胞。这里有12个牢房。桌子的高度是len(桌子)。则宽度为len(表[0])。单元格的数目是高度*宽度。 所以:

^{pr2}$

如果我试过这个:

def len(self):
    len(self.nestedList)*len(self.nestedList[0])

我“没有”

  1. 如果在shell中我写下Menny,Sami等名字,然后打印剩下的行(年龄,薪水等)。。。。 所以我想了想:

    def the_row (self, rowname):
    rows_checking = []
    for i in range(1, len(table)):
        rows_checking.append(table[i])
        if rowname in rows_checking:
            table[i].remove(table[0:0])
            return table[i]
    
    1. 与第二个任务几乎相同,但这次函数将打印2个对象的公共值。例如,如果我写Menny和Age,代码将打印“1”。 再一次,我想我会做的和我在任务前做的一样,但是这次:

    获取\u值(self、rowname、colname)

到目前为止似乎是个好主意,我希望如此。。。 但我有错误:

AttributeError: Table instance has no attribute '__len__'

或者

AttributeError: Table instance has no attribute 'len'

可能是因为我没有用“自我”这个词,对吧?我能做什么? 你不必用勺子喂我,告诉我应该怎么写代码,但请尽可能给我一些建议。在

编辑代码:

class Table:

def __init__(self,path,sep):
    self.path=path
    self.sep=sep
    self.g=[]
    self.count=0
    self.headlines=[]
    self.matrix=[]
    self.headrows=[]
    self.postionrow=0
    self.postioncolmn=0
    try:
        f=open(self.path,'r')

        read_file=f.read()
        split_file=read_file.split()
        for line in split_file:
            list_the_line=line.split(self.sep)
            self.g.append(list_the_line)
        self.count=0    
        for z in range (len(self.g[0])):
            self.count=0 
            for d in range(len(self.g[0])):
                if self.g[0][z]==self.g[0][d]:
                    self.count+=1
            if self.count>=2:
                raise ValueError        




        num_first_line=len(self.g[0])
        for k in range (len(self.g)):
            if len(self.g[k])!= num_first_line:
                raise ValueError

        self.headlines=self.g[0]        
        self.g.remove(self.g[0])

        self.count=0
        for row_name1 in range (len(self.g)):
            self.count=0
            for row_name2 in range(len(self.g)):
                if self.g[row_name1][0]==self.g[row_name2][0]:
                    self.count+=1

            if self.count>=2:
                raise ValueError







        for i in range (len(self.g)):
            self.headrows.append(self.g[i][0])
            self.g[i].remove(self.g[i][0])

        ezer=[]

        for op in range (len(self.g)):
            ezer=[]
            for od in range (len(self.g[0])):
                ezer.append(self.g[od][op])
            self.matrix.append(ezer)    


        f.close()    




    except :
        print "cannot creat a table object from this file"
        return

def len(self):
    num_rows=len(self.g)
    num_cols=len(self.g[0])
    return num_rows*num_cols

def get_row(self,rowname):
    for i in range (len(self.headlines)):
        if rowname==self.headrows[i]:
            self.postionrow=i
            return self.g[i]

    if not rowname in self.headrows :
        raise ValueError
def get_column(self,colname):
    for i in range (len(self.headlines)):
        if colname==self.headlines[i]:
            self.postioncolmn=i-1

            return self.matrix[i-1]

    if not colname in self.headlines :
        raise ValueError
def get_value(self,rowname,colname):
    self.get_row(rowname)
    self.get_column(colname)
    if not rowname in self.headrows :
        raise ValueError
    if not colname in self.headlines :
        raise ValueError

    return self.g[self.postionrow][self.postioncolmn]

def get_row_name_with_max_value(self,colname):
    if not colname in self.headlines :
        raise ValueError
    max_colmn=max(self.get_column(colname))
    for i in range (len(self.matrix)):

        if max_colmn == self.g[i][self.postioncolmn]:

            return self.headrows[i]

结果应该是什么:

>>> table = Table("table_examp1111111","\t")
    cannot create a table from this file 
>>> table = Table("table_example1.txt","\t")             
>>> print table.len() 
    12 
>>> print table.get_row("Menny")
    ['M', '1', '1', '1'] 
>>> print table.get_column("Height") 
    ['1', '2', '3'] 
>>> print table.get_value("Sami","Age")
    3
>>> print table.get_row_name_with_max_value("Height")
    Sami
>>> print table.get_row_name_with_max_value("Salary")
    Sami

这段代码很管用,但我想让它更像Python。请不要更改表单,不要添加或删除函数,只需修复我的syntex。 谢谢。在


Tags: inselfforgetlenifdeftable
3条回答

无论何时对对象调用函数len()。它将尝试调用该对象的函数。所以如果你这么做的话可能会奏效。在

def __len__(self):
    height = len(self.table)
    width = len(self.table[0])
    return height * width

您正在绑定对Table类调用__len__,而您看起来应该在构造函数中的table字符串数组中调用它。 您应该创建一个属性self.table,然后使用len函数,或者

def numOfCells(self): 
    return len(self.table) * len(self.table[0])

这看起来是使用csv模块的完美场所:

import csv

def load_csv(fname, **kwargs):
    with open(fname, 'rb') as inf:
        in_csv = csv.reader(inf, **kwargs)
        return list(in_csv)

class Table:
    def __init__(self, path, sep=','):
        self.table = load_csv(path, delimiter=sep)

        if len(self.table) == 0:
            raise ValueError('No data in file {}'.format(path))

        self.header = self.table.pop(0)
        self.cols   = len(self.header)
        self.labels = {}
        for i, row in enumerate(self.table, 1):
            # make sure rows are all same length
            if len(row) != self.cols:
                raise ValueError('row {} contains {} items - should be {}'.format(i, len(row), self.cols))
            # make sure rows-labels are unique
            lbl = row[0]
            if lbl in self.labels:
                raise ValueError('rows {} and {} - duplicate labels'.format(self.labels[lbl], i))
            else:
                self.labels[lbl] = i - 1

    @property
    def rows(self):
        return len(self.table)

    @property
    def cells(self):
        return self.rows * (self.cols - 1)  # omit row labels

    def get_row_by_label(self, lbl):
        return self.table[self.labels[lbl]]

    def get_item(self, lbl, attr):
        ndx = self.header.index(attr)
        return self.get_row_by_label(lbl)[ndx]

def main():
    t = Table('tbl.csv')
    print(t.cells)
    print(t.get_row_by_label("Menny"))
    print(t.get_item("Menny", "Age"))

if __name__=="__main__":
    main()

相关问题 更多 >