web-dev-qa-db-ja.com

名前付きタプルの行としてCSVファイルデータを読み取るPythonの方法は何ですか?

ヘッダー行を含むデータファイルを取得し、この行を名前付きタプルに読み込んで、ヘッダー名でデータ行にアクセスできるようにするための最良の方法は何ですか?

私はこのようなことを試みていました:

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)

リーダーオブジェクトは添え字化できないため、上記のコードはTypeErrorをスローします。ファイルヘッダーをnamedtupleに読み込むPythonicの方法は何ですか?

32
drbunsen

使用する:

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...
37
Sven Marnach

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]
23
jcollado