我已完成以下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
现有代码的反馈也很受欢迎。
答案 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 = []
将阻止其他方法失败。