首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将参数传递给Python类

将参数传递给Python类
EN

Stack Overflow用户
提问于 2018-10-16 05:52:58
回答 3查看 91关注 0票数 0

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

代码语言:javascript
复制
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代码中,并尝试访问这个类方法,如下所示:

代码语言:javascript
复制
myobjectx = MyClass()
colsListA = [(0,1), (1,23), (23,31), (31,35),(35,41)]
outputfile1=myobjectx.textcsvconverter(finalpath1,colsListA)

它给了我下面的错误信息:

代码语言:javascript
复制
TypeError: __init__() takes exactly 3 arguments (1 given)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-16 05:58:29

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

代码语言:javascript
复制
def __init__(self, filename=None, colsList=[]):
    self.filename=filename
    self.colsList=colsList

因此,您可以声明您的实例,而不需要在其中添加任何参数。

代码语言:javascript
复制
myobjectx = MyClass()

而且,您可以像现在使用textcsvconverter方法那样懒散地分配或放入参数。

更新

如下所示,我可以看到,您正在尝试使用特定的输入创建类的实例:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-10-16 06:26:29

据我所知,你采用了init方法中的这两个论点。这就是原因,你会得到错误的。

代码语言:javascript
复制
 TypeError: __init__() takes exactly 3 arguments (1 given)

解决方案是,您应该更改init方法,如下所示。

代码语言:javascript
复制
def __init__(self, filename=None, colsList=[]):
    self.filename=filename
    self.colsList=colsList

代码语言:javascript
复制
colsListA = [(0,1), (1,23), (23,31), (31,35),(35,41)]
myobjectx = MyClass(finalpath1, colsListA)
outputfile1=myobjectx.textcsvconverter(finalpath1,colsListA)

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

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2018-10-16 07:27:38

在做了一个小小的改动之后,它现在开始工作了:-) cols=self.colsList感谢您的帮助和支持

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52828714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档