Fabrica用于不同的解析器

时间:2015-03-08 22:41:47

标签: python xml json oop csv

问题:

  • 写一个类Fabrica给出的方式:文件和/或格式文件的方式, return:dict中此文件的数据。
  • 写一个抽象类Reader只有一种方法" reader" 没有实施。
  • 编写3个类CSVReader,XMLReader,JSONReader。他们 继承自Reader,必须实现方法"读者"同 解析csv,json,xml的功能。必须返回数据 dict格式为fabrica。

所以我有下一个问题。我不明白如何正确地写出所有课程。我写了解决方案,但有错误(下面的代码)。 我的问题是:如何正确编写所有类?

并推荐给我一本关于OOP的好书。)

class FactoryRader:
    def __init__(self, fileName,frmt=None):
        self.frmt = frmt
        self.fileName = fileName

    def __str__(self):
        return Reader.openFile(self.fileName, self.frmt)



class Reader:
    def openFile(fileName, frmt):
        try:
            with open(fileName, 'rU') as data:
                if fileName.endswith('.csv') or frmt == 'csv':
                    return CSVReader.reader(data)
                if fileName.endswith('.xml') or frmt == 'xml':
                    return XMLReader()
                if fileName.endswith('.js') or (frmt == 'json' or frmt == 'js'):
                    return JSONReader()
                else:
                    return 'Incorrect File!'
        except IOError:
            print('Cant open')

    def reader(data):
        pass


class CSVReader(Reader):
    def reader(data):
        dialect = csv.Sniffer().sniff(data.readline(), [',',';'])
        data.seek(0)
        reader = csv.DictReader(data, dialect=dialect)
        for row in reader:
            print (row)


class JSONReader(Reader):
    def reader(data):
        pass

class XMLReader(Reader):
    def reader(data):
        pass

if __name__ == '__main__':
    data = FactoryRader('CsvExamples/price.csv')
    print(data)

错误

    Traceback (most recent call last):
  File "ClassParsers.py", line 62, in <module>
    print(data)
TypeError: __str__ returned non-string (type NoneType)

1 个答案:

答案 0 :(得分:0)

这绝不是一个完整的解决方案;这只是一堆言论。

据我所知,Reader中的try / except块应该在FactoryReader中。 Python中没有抽象类这样的东西,所以你的类Reader可能是空的。或者,如果您愿意,只需

class Reader:
    def reader(data):
         pass

(如果您使用的是Python2,最好使用新的样式类:class Reader(object))。

要求FactoryReader返回字典,而不是字符串,因此__str__函数并不重要。你得到的错误是告诉你FactoryReader中的__str__方法应该返回一个字符串。最好不要实现__str__并为该函数使用其他名称;说get_reader。然后,您应该以dict方式返回数据。所以它会是

def get_reader(self):
    if self.fileName.endswith('.csv') or self.frmt == 'csv':
        return CSVReader(self.filename)
    etc

然后,

class CSVReader(Reader):
    def reader(filename):
        code to open filename, read it and parse it
        code to convert parsed code into dict
        return dict

同样适用于JSONReaderXMLReader