2012-01-25 12 views
28

Bir üstbilgi satırı içeren bir veri dosyası almanın ve bu satırı adlandırılmış bir tuple okuyabilmenin en iyi yolu nedir, böylece veri satırlarına başlık adıyla erişilebilir?CSV dosya verilerini adlandırılmış komut satırı olarak okumak için kullanılan pythonik yol nedir?

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) 

okuyucu nesne İndislenebilir değil, bu yüzden yukarıdaki kod TypeError atar:

Böyle bir şey çalışıyordu. Bir dosya üstbilgisini adlandırılmış bir dosyaya okuyup pythonic yolu nedir?

cevap

31

Kullanım:

Data = namedtuple("Data", next(reader)) 

ve çizgi ihmal: Aşağıdaki Martineau'nun Yorum dayalı iteratif sürümü ile bu birleştiren

next(reader) 

, örnek

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 2 için olur ve Python 3 için

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... 
+1

drbunsen: Bunu yaptıktan sonra size işlem döngü değiştirebilir nedense hala bir collections.namedtuple olarak satırları erişmesi gerekiyorsa aşağıdaki gibi

, adlandırılmış küpe için sözlükleri dönüştürmek için kolay olmalı : 'haritadaki veriler için (Data._make, reader):'. – martineau

+0

@spinup: Düzenlemenizi biraz değiştirdim. – martineau

+0

Eğer csv verisinde bir başlık yoksa? Sütuna ad atamanın bir yolu var mı? (CSV verisi bir adlandırılmış başlık içermiyorsa ve sütun adları atamak istiyorsanız, bana tek seçeneğim bunu sözlükler dizisi olarak okumaktır). –

20

Lütfen csv.DictReader'a bir göz atın. Temel olarak, sütun satırlarını aradığınız ilk satırdan alma olanağı sağlar ve bundan sonra, bir satırdaki her sütuna bir sözlük kullanarak erişmenizi sağlar.

with open('data_file.txt') as infile: 
    reader = csv.DictReader(infile) 
    Data = collections.namedtuple('Data', reader.fieldnames) 
    tuples = [Data(**row) for row in reader] 
+2

Bu çözümle ilgili sorun, her satırın bir sözlüğe dönüştürülmesi ve daha sonra adlandırılmış bir tuple dönüştürülmesidir. Ara sözlük gerekli değilse verimsiz. –

+0

Bu, siparişi korumaz. Bu nedenle, csv'nizdeki ilk sütun, adlandırılmış öğede rastgele bir hale gelir. Bu noktada, bir dict da kullanabilir. – hraban