2013-04-05 18 views
5

Tôi đang cố gắng đọc các phân đoạn của tệp CSV thành DataFrame gấu trúc và tôi gặp sự cố khi tôi đặt nrows thành nhiều hơn một điểm nhất định. Tệp CSV của tôi được chia thành các phân đoạn khác nhau với các tiêu đề/loại dữ liệu khác nhau, vì vậy tôi đã xem qua tệp và tìm thấy số dòng của các phân đoạn khác nhau và lưu số dòng. Khi tôi cố gắng làm:Đọc các phần của ~ 13000 tệp CSV hàng với gấu trúc read_csv và nrows

pd.io.parsers.read_csv('filename',skiprows=40, nrows=12646) 

Nó hoạt động tốt. Bất kỳ hàng nào khác, và nó ném một lỗi:

CParserError: Error tokenizing data. C error: Expected 56 fields in line 13897, saw 71 

Đúng là dòng 13897 có nhiều hàng, đó là lý do tại sao tôi đang cố gắng sử dụng nrows và skiprows. Tôi có thể tìm thấy hàng cuối cùng mà gấu trúc sẽ đọc và nó trông không khác gì so với phần còn lại. Nhìn vào các tập tin trong một trình soạn thảo hex tôi vẫn không thấy bất kỳ sự khác biệt.

Tôi cũng đã thử nó với tập tin CSV khác, và tôi nhận được kết quả tương tự:

pd.io.parsers.read_csv('file2',skiprows=112, nrows=18524) 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 18188 entries, 0 to 18187 

Nhưng:

pd.io.parsers.read_csv('file2',skiprows=112, nrows=18525) 

cho:

CParserError: Error tokenizing data. C error: Expected 56 fields in line 19190, saw 71 

Có cái gì tôi 'M mất tích? Có một cách khác để làm điều này?

Tôi đang sử dụng: pandas-0.10.1.win-amd64-py3.3, numpy-MKL-1.7.1rc1.win-amd64-py3.3python-3.3.0.amd64 trên Windows. Tôi gặp vấn đề tương tự với numpy-unoptimized-1.7.1rc1.win-amd64-py3.3.

+0

Có một cái gì đó tanh với dòng này với nó như nó có 70 dấu phẩy, nơi mọi dòng trước đó có 55 ...? –

+0

Dòng lỗi được đề cập đến là một dòng với 70 dấu phẩy, có. Nhưng với những tiếng lách cách và nrows, tôi đang cố gắng ngăn nó đi tới vạch đó. Ví dụ: khi lỗi đề cập đến dòng 13897, tôi đang cố đọc từ dòng 40 đến 12647 + 40. Các hàng tôi đang cố gắng chỉ định là bình thường (55 trường). – dooz

Trả lời

3

Bạn có thể sử dụng warn_bad_lineserror_bad_lines để tắt xấu dòng lỗi & cảnh báo:

import pandas as pd 
from StringIO import StringIO 
data = StringIO("""a,b,c 
1,2,3 
4,5,6 
6,7,8,9 
1,2,5 
3,4,5""") 
pd.read_csv(data, warn_bad_lines=False, error_bad_lines=False) 
+0

Điều này dường như làm việc nhưng tôi vẫn tự hỏi tại sao nó đã ném lỗi ở nơi đầu tiên. Tôi đã viết một giải pháp workaround sử dụng bộ đệm StringIO trong thời gian có nghĩa là, nhưng như tôi đã nói tôi tự hỏi tại sao nó cho tôi một lỗi cho một dòng nó không được nói để đọc. pd.read_csv đọc (cùng) dữ liệu tốt (không có cờ bad_lines) từ StringIO tạo thành từ các dòng của tập tin tôi đang cố gắng để nói với nó để đọc với nrows và skiprows. – dooz