36

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

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

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の方法は何ですか?

4

3 に答える 3

48

使用する:

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...
于 2012-01-25T17:30:05.817 に答える
28

をご覧ください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]
于 2012-01-25T18:05:18.523 に答える