正确使用类(csv阅读器示例)

时间:2015-07-29 10:24:10

标签: python csv

我已完成以下CSV阅读器课程:

class CSVread(object):
    filtered = []

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

    def get_file(self):
        try:
            with open(self.file, "r") as f:
                self.reader = [row for row in csv.reader(f, delimiter = ";")]
                return self.reader
        except IOError as err:
            print("I/O error({0}): {1}".format(errno, strerror))
        return

    def get_num_rows(self):
        print(sum(1 for row in self.reader))

可以与以下示例一起使用:

datacsv = CSVread("data.csv") # ; seperated file

for row in datacsv.get_file(): # prints all the rows
    print(row)

datacsv.get_num_rows() # number of rows in data.csv

我的目标是通过关键字“00GG”过滤第12列来过滤掉csv文件(data.csv)的内容。我可以让它在课外工作:

with open("data.csv") as csvfile:
    reader = csv.reader(csvfile, delimiter = ";")
    filtered = []
    filtered = filter((lambda row: row[12] in ("00GG")), list(reader))

以下代码在类中定义时返回一个空列表(已过滤):

def filter_data(csv_file):
    filtered = filter((lambda row: row[12] in ("00GGL")), self.reader)
    return filtered

现有代码的反馈也很受欢迎。

1 个答案:

答案 0 :(得分:0)

在第一个过滤器示例中,您是否正在搜索00GG,而在第二个过滤器示例中,您正在搜索00GGL

无论如何,如果要在类中定义filter_data(),您应该编写该类作为类的方法。这意味着它需要self参数,而不是csv_file

def filter_data(self):
    filtered = filter((lambda row: row[12] in ("00GGL")), self.reader)
    return filtered

使它更通用:

def filter_data(self, column, values):
    return filter((lambda row: row[column] in values), self.reader)

现在你可以这样称呼它:

datacsv.filter_data(12, ('00GGL',))

如果输入数据确实包含第12列中带有00GGL的行,则该文件应该有用。

请注意filter_data()只应在 get_file()之后调用,否则不会self.reader。除非您有充分的理由在创建CSVread对象时不读取数据(例如,您的目标是进行延迟评估),否则应该在那时阅读它。否则,设置self.reader = []将阻止其他方法失败。