在此过程中有点困在这里。我目前有一个类,它是一个相当简单的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'})
但是,这对于每一行的每个列更改都非常耗时且相当烦人。似乎必须有一种比迭代[列数更改]次数更快的方法(在数据的一次迭代中)。
有办法做到这一点吗?