繁体   English   中英

python中的表格-有一些错误-不知道为什么

[英]tables in python - having some errors - not sure why

我对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(table)。 然后,宽度为len(table [0])。 单元格的数量是高度*宽度。 所以:

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

如果我尝试了这个:

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

我得到“无”

  1. 如果在外壳中写上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 and Age,代码将打印“ 1”。 再一次,我想我会做的和之前的任务差不多,但是这次:

    get_the_value(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

这段代码有效,但我想使其更具pythonic风格。 请不要更改表格,不要添加或删除功能,只需修复我的syntex。 谢谢。

每当在对象上调用函数len()时。 它将尝试调用该对象的__ 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()

编辑:

好的,这是您的第一个问题。 据我了解,您想要一个可以返回表中单元格数量的函数。 该数字不包括行中的人员名称,也根本不包括第一行。 如果我理解正确,那么应该可以:

如果表是:

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

那么单元格的数量是'12' ...

例:

class Table:

    def __init__(self, path, sep):
        try:
            with open(path) as f:
                read_file = f.read() # will auto close the file after the read
        except:
            print "cannot create a table from this file"
            return



        self.table = read_file.split('\n') # self.table will make this easier
        self.table = [self.table[i].split(sep) for i in range(len(self.table))] # does the same as your for loop



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

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

       # now a function that could return the table length
   def get_num_cells(self):
       # essentially you sum each item in row[1:] for table[1:]
       return sum((sum(1 for i in range(1, len(self.table[0])))) for i in range(1,len(self.table)))

使用self.table将使此操作变得更容易,因为您不必像上面在get_num_cellsget_num_cells将其包含在其他函数args中,我只是使用了self.table而不将其放在函数的args中。

要调用此函数,您需要执行以下操作:

app = Table(path, sep)
app.get_num_cells()
# this code would be placed at the end of your file, and not inside the class

例:

class Table()

    __init__(self, path, sep):
        etc.

   etc.etc.etc.

# now the code to create an instance of Table and call a method here like this
app = Table(path, sep) # path would be a filepath "C:/etc./file.txt", and sep = "," etc.
app.get_num_cells()

对于您的其他问题,我不确定您想要什么,但是如果您在评论中再次写信,我会尝试。 请让我知道这是否适合您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM