我创建了一个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)
答案 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谢谢大家的帮助和支持