将参数传递给Python类

时间:2018-10-16 05:52:59

标签: python pyspark

我创建了一个Python类来解析文本输入文件,以便获得CSV格式的文件。 下面是我的课程代码:

import os
from os import listdir

class MyClass:
    def __init__(self, filename, colsList):
        self.filename=filename
        self.colsList=colsList

    def textcsvconverter(self,filename,colsList):
        import csv
        print("colsList:",colsList)
        self.cols=colsList
        outputfilename=(os.path.basename(filename))
        print("outputfilename:",outputfilename)
        fname_out =(outputfilename + '.csv')
        with open(filename) as fin, open(fname_out, 'wt') as fout:
            writer = csv.writer(fout, delimiter=",", lineterminator="\n")
            for line in fin:
                line = line.rstrip()  # removing the '\n' and other trailing whitespaces
                data = [line[c[0]:c[1]] for c in cols]
                writer.writerow(data)
            return fname_out

现在,我已在Pyspark代码中导入了该类,并尝试访问如下所示的类方法:

myobjectx = MyClass()
colsListA = [(0,1), (1,23), (23,31), (31,35),(35,41)]
outputfile1=myobjectx.textcsvconverter(finalpath1,colsListA)

它给我下面的错误信息:

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

3 个答案:

答案 0 :(得分:1)

您已经使用带有3个参数的init方法声明了您的类。但是您已经输入了。如代码所示,您可以在init方法中获取默认值。

def __init__(self, filename=None, colsList=[]):
    self.filename=filename
    self.colsList=colsList

因此,您可以在不添加任何参数的情况下声明实例。

myobjectx = MyClass()

而且,您可以像现在使用textcsvconverter方法一样懒散地赋值或放置参数。

更新

正如您在下面的评论中,我可以看到您正在尝试使用特定的输入来创建类的实例:

finalpath1 = 'your-filename.csv' # I assume you have it
colsListA = [(0,1), (1,23), (23,31), (31,35),(35,41)] 
myobjectx = MyClass(finalpath1,colsListA)
outputfile1=myobjectx.textcsvconverter()

并且您必须更新textcsvconverter才能使用self.attribute。

答案 1 :(得分:1)

据我所知,您在init方法中使用了两个参数。这就是原因,您将得到错误。

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

解决方案是,您应该像这样更改init方法。

def __init__(self, filename=None, colsList=[]):
    self.filename=filename
    self.colsList=colsList

OR

colsListA = [(0,1), (1,23), (23,31), (31,35),(35,41)]
myobjectx = MyClass(finalpath1, colsListA)
outputfile1=myobjectx.textcsvconverter(finalpath1,colsListA)

在上述第二种情况下,您需要修改整个代码。

import os
from os import listdir

class MyClass:
def __init__(self, filename, colsList):
    self.filename=filename
    self.colsList=colsList

def textcsvconverter(self):
    import csv
    print("colsList:",self.colsList)
    self.cols=self.colsList
    outputfilename=(os.path.basename(self.filename))
    print("outputfilename:",outputfilename)
    fname_out =(outputfilename + '.csv')
    with open(self.filename) as fin, open(fname_out, 'wt') as fout:
        writer = csv.writer(fout, delimiter=",", lineterminator="\n")
        for line in fin:
            line = line.rstrip()  # removing the '\n' and other trailing    whitespaces
            data = [line[c[0]:c[1]] for c in cols]
            writer.writerow(data)
        return fname_out


  colsListA = [(0,1), (1,23), (23,31), (31,35),(35,41)]
  myobjectx = MyClass(finalpath1,colsListA)
  outputfile1=myobjectx.textcsvconverter()

答案 2 :(得分:0)

稍作更改后即可使用:-) cols = self.colsList谢谢大家的帮助和支持