2011-09-28 16 views
10

Alan adlarını dosyadan çıkarmak için csv.DictReader numaralı telefonu istiyorum. The docs demek "FieldNames parametresi atlanırsa, csvfile dosyasının ilk satırındaki değerler alan adları olarak kullanılır.", ama benim durumumda, ilk satır, bir başlık ve isimleri içeren 2. sıra kontaints.Ön başlık satırları csv.DictReader ile nasıl atlanır?

next(reader), Python 3.2 skip a line in csv.DictReader uyarınca uygulayamıyorum çünkü alan adı ataması, okuyucuyu başlatırken gerçekleşiyor (ya da yanlış yapıyorum).

CanVec v1.1.0,,,,,,,,,^M 
Entity,Attributes combination,"Specification Code 
Point","Specification Code 
Line","Specification Code 
Area",Generic Code,Theme,"GML - Entity name 
Shape - File name 
Point","GML - Entity name 
Shape - File name 
Line","GML - Entity name 
Shape - File name 
Area"^M 
Amusement park,Amusement park,,,2260012,2260009,LX,,,LX_2260009_2^M 
Auto wrecker,Auto wrecker,,,2360012,2360009,IC,,,IC_2360009_2^M 

Kodum:

f = open(entities_table,'rb') 
try: 
    dialect = csv.Sniffer().sniff(f.read(1024)) 
    f.seek(0) 

    reader = csv.DictReader(f, dialect=dialect) 
    print 'I think the field names are:\n%s\n' % (reader.fieldnames) 

    i = 0 
    for row in reader: 
     if i < 20: 
      print row 
      i = i + 1 

finally: 
    f.close() 

Güncel sonuçları:

I think the field names are: 
['CanVec v1.1.0', '', '', '', '', '', '', '', '', ''] 

İstenilen sonuç:

I think the field names are: 
['Entity','Attributes combination','"Specification Code Point"',...snip] 

CSVfile (Excel 2010, original source ihraç)

Sadece ilk satırı silmek ve devam etmek için uygun olacağını fark ediyorum, ancak eldeki müdahaleyi en aza indirgeyebildiğim kadar in situ veriyi sadece okumak için yakınlaşmaya çalışıyorum.

cevap

1

Itertools'tan islice kullanılır. Başlığım büyük bir girişin son satırındaydı. Giriş bölümünden geçtim ve alan adları için hederline kullandım:

with open(file, "r") as f: 
    '''Pass preamble''' 
    n = 0 
    for line in f.readlines(): 
     n += 1 
     if 'same_field_name' in line: # line with field names was found 
      h = line.split(',') 
      break 
    f.close() 
    f = islice(open(i, "r"), n, None) 

    reader = csv.DictReader(f, fieldnames = h) 
+0

Bu, bir alanın kesin bir ismini (makul bir beklenti) bilmesi koşuluyla, daha esnek bir çözümdür. Teşekkürler. –

12

f.seek(0) sonra ekleyin:

next(f) 

DictReader başlatılıyor önce ikinci satıra dosya işaretçisi ilerlemek için.

+0

doh! tabii ki. Bir acemi ile sabrınız için çok teşekkürler. –

İlgili konular