解析器类,以指定列更改的方式传递

时间:2014-05-29 19:34:23

标签: python python-2.7

在此过程中有点困在这里。我目前有一个类,它是一个相当简单的CSV文件解析器,它将数据封装在self.data参数中,并提供获取数据的方法。

import os
from collections import namedtuple
from app import config

class CSVReader():
  def __init__(self, csv_name):
    self.csv_name = csv_name

  def read_csv():
    with open(os.path.join(config['CSV_PATH'], self.csv_name)) as f:
      c_read = csv.DictReader(f)
      self.CSVRow = namedtuple('CSV_ENTRY', c_read.fieldnames)
      self.data = [self.CSVRow(**row) for row in c_read]

  # ...

当我想要不同列的不同数据表示时,我遇到的问题。以下是一些示例数据:

name       is_registered   role
'Crow'     '1'             '3'
'Not Crow' '0'             '2'

在这种情况下,我想要更像这样的东西:

 name       is_registered   role
'Crow'      True            'bird'
'Not Crow'  False           'user'

在大多数情况下,很多东西仍然是一个字符串。但是,我经常想要更改数据类型以匹配更直观的类型或名称。如何最有效地传递有关如何处理此类中的列的说明?

我真正遇到的唯一解决方案是添加如下方法:

def column_to_boolean(self, field):
  for index, entry in enumerate(self.data):
    as_dict = entry._asdict() # namedtuples are immutable
    as_dict[field] = as_dict[field] == '1'
    self.data[index] = self.CSVRow(**as_dict)

然后在我的应用程序中,我会做类似以下的事情:

my_csv = CSVReader('blah.csv')
my_csv.column_to_boolean('is_registered')
my_csv.column_to_enum('role', {'3': 'bird', '2': 'user'})

但是,这对于每一行的每个列更改都非常耗时且相当烦人。似乎必须有一种比迭代[列数更改]次数更快的方法(在数据的一次迭代中)。

有办法做到这一点吗?

0 个答案:

没有答案