将文件传递给类

时间:2013-08-05 20:41:19

标签: python class

第一次在这里写课,我需要一些帮助。

我一直在尝试编写一个类,其中第一个采用制表符分隔的csv文件并输出字典列表。字典中的每个键都是csv中的列标题。

到目前为止,这是我班级的样子:

import csv

class consolidate(object):

    def __init__(self, file):
        self.file = file

    def create_master_list(self):
        with(open(self,'rU')) as f:
            f_d = csv.DictReader(f, delimiter = '\t')
            m_l = []
            for d in f_d:
                m_l.append(d)
        return m_l

当我尝试传递一个文件时,如下所示:

c = consolidate()
a = c.create_master_list('Abilities.txt')

我收到以下错误:

TypeError: __init__() takes exactly 2 arguments (1 given)

我知道我想将文件参数传递给create_master_list函数,但我不确定这样做的正确语法是什么。

我已尝试self.filefile作为参数,但两者都不起作用。

谢谢!

3 个答案:

答案 0 :(得分:3)

问题

您没有为__init__()提供第二个参数:

class consolidate(object):
    def __init__(self, file):
        self.file = file
    # rest of the code

当你像这样实例化它时:

c = consolidate()

解决方案

这应该有效。将类定义更改为:

import csv

class consolidate(object):

    def __init__(self, filename):
        self.filename = filename

    def create_master_list(self):
        with open(self.filename, 'rU') as f:
            f_d = csv.DictReader(f, delimiter='\t')
            m_l = []
            for d in f_d:
                m_l.append(d)
        return m_l

然后像这样使用它:

c = consolidate('Abilities.txt')
a = c.create_master_list()

这是实现修复的一种方法。

注意:我还更改了命名(self.file建议它是文件对象,而它实际上是文件名,因此self.filename)。还要记住,路径是相对于执行脚本的路径。

答案 1 :(得分:3)

您应该将该文件作为参数传递给__init__

c = consolidate ('abilities.txt')

然后在create_master_list内,您应该打开self.file

with (open (self.file, 'rU') ) as f:

现在你可以打电话了

a = c.create_master_list ()

答案 2 :(得分:2)

那是因为__init__的{​​{1}}方法需要consolidate的参数:

file

但你没有给它任何东西:

def __init__(self, file):

要解决此问题,请更改您的类:

c = consolidate()

然后像这样使用它:

import csv

# I capitalized the name of this class because that is convention
class Consolidate(object):

    def __init__(self, file):
        self.file = file

    def create_master_list(self):
        # 'self' is the instance of 'Consolidate'
        # you want to open 'self.file' instead, which is the file
        with(open(self.file,'rU')) as f:
            f_d = csv.DictReader(f, delimiter = '\t')
            m_l = []
            for d in f_d:
                m_l.append(d)
        return m_l