我正在尝试从DictReader对象创建一个namedtuple。我的代码如下所示。我正在努力解决的问题是我正在使用的csv文件中有一些非常长且难看的列标题。对于本示例,我正在使用的列标题之一是:
“您的感恩节晚餐通常主要吃什么?”。
让我烦恼的是,该标题中有一堆空格,因此,如果我理解正确,namedtuple认为这些都是自变量。您会建议采用哪种方式解决此问题?我已经引用了多个线程,并觉得我几乎可以通过此线程到达那里:What is the pythonic way to read CSV file data as rows of namedtuples?
我仅以一个列标题为例。这是我到目前为止的一些代码:
import csv
import collections
filename = 'thanksgiving2015.csv'
with open(filename, 'r', encoding = 'utf-8') as f:
reader = csv.DictReader(f)
columns = collections.namedtuple('columns',
'What is typically the main dish at your
Thanksgiving dinner?')
在创建namedtuple之前,是否应该除去其所有这些列标题?我什至可以在excel中导入csv之前就可以做到这一点,但是我认为python中有一个不错的解决方案。
答案 0 :(得分:0)
namedtuple
将单个字符串视为由空格分隔的字段名称列表。您需要传递一个明确的列名列表。
namedtuple('columns', ['What is...', 'some other absurd column name'])
我会重新考虑直接将标头值用作字段名称。忽略标题,并传递一个较短的名称列表,以后可以用作属性。
答案 1 :(得分:0)
chepner指出,nametuple()的第二个参数可以是空格分隔的字符串,也可以是字符串列表,例如:
columns = collections.namedtuple('columns',
['What is typically the main dish at your Thanksgiving dinner?', 'other column'])
但是,这样做会失败:
ValueError: Type names and field names must be valid identifiers
这是因为columns
(应大写为Columns
)将成为带有“通常是什么...”作为标识符的对象,并且标识符不能有空格。要清楚,您可以将其用作:
Columns = namedtuple('columns', ['what is', 'this'])
columns = Columns('foo', 'bar')
print(columns.this) # Works fine
print(columns.what is) # Not going to work
如果您使用的是简单的dict(),则应编写:
print(columns['what is'])
但是,您可以要求namedtuple重命名无效的标识符:
Columns = namedtuple('columns', ['what is', 'this'], rename=True)
print(columns._0) # ugly but valid
print(columns.this)