2012-04-12 29 views
5

Tôi đang sử dụng python với khối u để đọc dữ liệu từ một mô hình số trong một tệp văn bản có định dạng khá phức tạp.Python: Đọc các tập tin văn bản phức tạp với số lốm

Chức năng genfromtxt và fromfile của Numpy hoạt động tốt, nhưng chỉ khi dữ liệu được cấu trúc. file dữ liệu của tôi trông giống như sau:

------ snip

[sitename] [dimemsion 1 size] [dimension 2 size] 
[data for dim 1] 
[data for dim 2] 
[date/time] 
[header data] 
[data (dim1 * dim2)] 
[header] 
[data] 
... 
. 
. 
[data/time] 
[header] 
[data] 
. 
. 
etc... 

---- snip

Vì vậy, tôi có một hỗn hợp của văn bản và số và phức tạp (nhưng lặp lại) bố cục. Làm thế nào là cách tốt nhất để đọc này bằng cách sử dụng numpy?

Chúc mừng,

Chris

+1

Bạn cần phải sử dụng 'NumPy 'chỉ phương thức? Có lẽ phần đọc có thể được thực hiện trong python đơn giản. –

Trả lời

5

NumPy là không giỏi phân tích khái quát hóa, vì vậy bạn sẽ làm tốt để nhìn xa hơn nó, và những gì bạn chọn sẽ phụ thuộc chủ yếu vào cách phù hợp các file đang có.

Nếu chúng cực kỳ nhất quán, do đó, bạn có thể trích xuất số từ các vị trí đã biết và các hàng đã biết, hơn bạn chỉ có thể đọc trong dòng tệp theo đường thẳng và lập chỉ mục này với ký tự mà bạn muốn. (Bước qua tệp, ví dụ: sử dụng tệp.readlines để nhận từng dòng dưới dạng một chuỗi.)

Trường hợp thông thường (ít nhất tôi tìm thấy) là nó đa dạng hơn ở trên, nhưng hoạt động chuỗi đơn giản có thể được sử dụng để phân tích cú pháp dòng, chẳng hạn như string.split (gần như luôn là bước đầu tiên của tôi), v.v.

Ngoài ra, có rất nhiều thư viện phân tích cú pháp bằng Python. Tôi là một phần để pyparsing (nhưng tôi không biết những người khác tốt, vì vậy nó không phải là một so sánh công bằng). Đây là a summary of the various parsing libraries.

+0

+1 cho pyparsing. Đây hoàn toàn là công cụ phù hợp cho công việc ở đây. –

+0

Cảm ơn - Tôi sẽ thử dùng pyparsing. Vì nó là python dựa (chứ không phải là một mô-đun c như numpy.fromfile), tôi đoán nó sẽ được chú ý chậm hơn so với sử dụng numpy? Chris – ccbunney

+0

Có, pyparsing chậm hơn đáng kể so với numpy.fromfile, ít nhất là từ kinh nghiệm của tôi. Tôi nghĩ rằng nó cũng làm nhiều hơn nữa mặc dù. Ngoài ra, mặc dù nó là một thư viện tốt, nó phải mất một số học tập. Vì lý do này, tôi khuyên bạn nên thử một lần với các thao tác chuỗi cơ bản, vì chúng thường thực hiện thủ thuật, và nếu chúng không hoạt động, đi đến pyparsing (trừ khi, tất nhiên, bạn muốn học pyparsing anyway). – tom10

1

Tôi đồng ý với câu trả lời trước. Chuỗi sau các bước làm việc tốt nhất và dễ dàng hơn rất nhiều so với pyparsing hoặc numpy.genfromtxt

inp = open(textfilename).readlines() 
my_list = [] 
for line in inp: 
    item = str.split(line) 
    my_list.append(float(item[0])) 

Sau đó, bạn có thể dễ dàng chuyển đổi danh sách thành một mảng NumPy/ma trận và tiến hành từ đó

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