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