namedtuple的使用

Python cookbook中有一个例子,有一个stocks.csv的文件,内容如下:

Symbol,Price,Date,Time,Change,Volume
"AA",39.48,"6/11/2007","9:36am",-0.18,181800
"AIG",71.38,"6/11/2007","9:36am",-0.15,195500
"AXP",62.58,"6/11/2007","9:36am",-0.46,935000
"BA",98.31,"6/11/2007","9:36am",+0.12,104800
"C",53.08,"6/11/2007","9:36am",-0.25,360900
"CAT",78.29,"6/11/2007","9:36am",-0.23,225400

使用collections.namedtuple将其内容读取为一个带字段名的元组:

import csv
from collections import namedtuple

with open('stocks.csv') as f:
    f_csv = csv.reader(f)
    headings = next(f_csv)
    Row = namedtuple('Row', headings)
    for r in f_csv:
        row = Row(*r) # 在python里,*号代表拆分,把list/tuple里的元素拆出来
        print(row.Symbol)

与普通元组(如下)相比,访问Symbol这一列时,普通元组需要使用下标row[0]来访问,而具名元组可以使用列名来访问row.Symbol。

import csv
from collections import namedtuple

with open('stocks.csv') as f:
    f_csv = csv.reader(f)
    headers = next(f_csv)
    for row in f_csv:
        print(row[0])

于是查了下namedtuple的使用。

collections.namedtuple(typename, field_names, verbose=False, rename=False)

其中(参考Python namedtuple):

  • typename:元组名称
  • field_names: 元组中元素的名称
  • rename: 如果元素名称中含有 python 的关键字,则必须设置为 rename=True
  • verbose: 默认就好

命名方法:


# 第一种方法:User = collections.namedtuple('User', ['name', 'age', 'id'])
# 第二种方法:User = collections.namedtuple('User', 'name age id')
# 第三种方法:User = collections.namedtuple('User', 'name, age, id')

实例化方法:

# 第一种方法: user = User('Mike', 21, 001)
# 第二种方法:user = User(name='Mike', age=21, id=001)
# 第三种方法:user = User._make(['Mike', 21, 001])

所以前面的例子中除了使用row = Row(*r)来生成对象外,还可以使用row = Row._make(r)