什么是将CSV文件数据作为命名元组行读取的pythonic方法?

drb*_*sen 31 python csv namedtuple

获取包含标题行的数据文件并将此行读入命名元组的最佳方法是什么,以便可以通过标题名称访问数据行?

我正在尝试这样的事情:

import csv
from collections import namedtuple

with open('data_file.txt', mode="r") as infile:
    reader = csv.reader(infile)
    Data = namedtuple("Data", ", ".join(i for i in reader[0]))
    next(reader)
    for row in reader:
        data = Data(*row)
Run Code Online (Sandbox Code Playgroud)

reader对象不是可订阅的,所以上面的代码抛出了一个TypeError.将文件头读入namedtuple的pythonic方法是什么?

Sve*_*ach 38

使用:

Data = namedtuple("Data", next(reader))
Run Code Online (Sandbox Code Playgroud)

并省略该行:

next(reader)
Run Code Online (Sandbox Code Playgroud)

将此与基于下面的martineau评论的迭代版本相结合,该示例适用于Python 2

import csv
from collections import namedtuple
from itertools import imap

with open("data_file.txt", mode="rb") as infile:
    reader = csv.reader(infile)
    Data = namedtuple("Data", next(reader))  # get names from column headers
    for data in imap(Data._make, reader):
        print data.foo
        # ...further processing of a line...
Run Code Online (Sandbox Code Playgroud)

而对于Python 3

import csv
from collections import namedtuple

with open("data_file.txt", newline="") as infile:
    reader = csv.reader(infile)
    Data = namedtuple("Data", next(reader))  # get names from column headers
    for data in map(Data._make, reader):
        print(data.foo)
        # ...further processing of a line...
Run Code Online (Sandbox Code Playgroud)

  • drbunsen:完成此操作后,您可以将处理循环更改为:`for data in map(Data._make, reader):`。 (2认同)

jco*_*ado 23

请看看csv.DictReader.基本上,它提供了在您查找时从第一行获取列名的功能,之后,您可以使用字典按名称访问行中的每个列.

如果由于某种原因你仍然需要作为a访问行collections.namedtuple,那么应该很容易将字典转换为命名元组,如下所示:

with open('data_file.txt') as infile:
    reader = csv.DictReader(infile)
    Data = collections.namedtuple('Data', reader.fieldnames)
    tuples = [Data(**row) for row in reader]
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案的问题是每行都转换为字典,然后转换为命名元组.如果不需要中间字典,则效率低下. (4认同)