我已经完成了以下 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
也欢迎对现有代码的反馈。
最佳答案
是否在第一个过滤器示例中您正在搜索 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',))
如果输入数据确实包含 00GGL
的行,则该方法应该有效在第 12 栏。
请注意filter_data()
只能在 get_file()
之后调用否则就没有self.reader
。除非你有充分的理由在CSVread
时不读入数据。对象被创建(例如,您的目标是延迟评估),那么您应该读取它。否则,设置 self.reader = []
这将防止其他方法失败。
关于python - 正确使用类(csv 阅读器示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31697773/