当列标题有空格时如何制作namedtuple

时间:2018-10-11 19:06:29

标签: python

我正在尝试从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中有一个不错的解决方案。

2 个答案:

答案 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)