Что такое pythonic способ чтения CSV файлов в виде строк с именами?
Каков наилучший способ взять файл данных, содержащий строку заголовка, и прочитать эту строку в именованном кортеже, чтобы доступ к строкам данных можно получить по имени заголовка?
Я пытался что-то вроде этого:
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)
Объект считывателя не подлежит расшифровке, поэтому приведенный выше код выдает a TypeError
. Что такое питонический способ чтения заголовка файла в namedtuple?
Ответы
Ответ 1
Использование:
Data = namedtuple("Data", next(reader))
и опустить строку:
next(reader)
Объединив это с итеративной версией, основанной на комментарии к 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...
и для 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...
Ответ 2
Пожалуйста, посмотрите csv.DictReader
. В принципе, он предоставляет возможность получить имена столбцов из первой строки, как вы ищите, и после этого позволяет вам получить доступ к каждому столбцу в строке по имени с помощью словаря.
Если по какой-то причине вам все равно нужно обращаться к строкам как 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]