2011-09-28 36 views
10

Tôi muốn csv.DictReader để suy ra tên trường từ tệp. The docs nói "Nếu tham số tên trường được bỏ qua, các giá trị trong hàng đầu tiên của csvfile sẽ được sử dụng làm tên trường.", nhưng trong trường hợp của tôi hàng đầu tiên containts một tiêu đề và hàng thứ 2 có chứa tên.Làm cách nào để bỏ qua dòng tiêu đề trước bằng csv.DictReader?

Tôi không thể áp dụng next(reader) theo Python 3.2 skip a line in csv.DictReader vì gán tên trường diễn ra khi khởi tạo trình đọc (hoặc tôi đang làm sai).

Các csvfile (xuất khẩu từ Excel 2010, original source):

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 

Mã của tôi:

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() 

kết quả hiện tại:

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

kết quả mong muốn:

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

Tôi nhận ra rằng sẽ thuận tiện khi chỉ xóa hàng đầu tiên và tiếp tục, nhưng tôi đang cố gắng gần với việc đọc dữ liệu tại chỗ nhất có thể và giảm thiểu sự can thiệp thủ công.

Trả lời

1

Tôi đã sử dụng islice từ itertools. Tiêu đề của tôi nằm ở dòng cuối cùng của phần mở đầu lớn. Tôi đã thông qua phần mở đầu và sử dụng hàng rào cho tên trường:

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

Đây là giải pháp linh hoạt hơn, miễn là người ta biết chắc chắn một tên trường (kỳ vọng hợp lý). Cảm ơn. –

12

Sau f.seek(0), chèn:

next(f) 

để thúc đẩy con trỏ tập tin vào dòng thứ hai trước khi khởi tạo DictReader.

+0

doh! tất nhiên. Rất cám ơn sự kiên nhẫn của bạn với người mới bắt đầu. –

Các vấn đề liên quan