ヘッダー行を含むデータファイルを取得し、この行を名前付きタプルに読み込んで、ヘッダー名でデータ行にアクセスできるようにするための最良の方法は何ですか?
私はこのようなことを試みていました:
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の方法は何ですか?
使用する:
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...
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]