2011-01-04 26 views
5

Tôi là một người nghiệp dư sử dụng Python và tắt trong một thời gian. Xin lỗi nếu điều này là một câu hỏi ngớ ngẩn, nhưng tôi đã tự hỏi nếu có ai biết một cách dễ dàng để lấy một loạt các dòng nếu định dạng trong file đầu vào là như thế này:Cách lấy các dòng SAU KHI một dòng phù hợp trong python

" Heading 1

Line 1

Dòng 2

Dòng 3

nhóm 2

Line 1

Dòng 2

Dòng 3 "

tôi sẽ không biết có bao nhiêu dòng là sau từng nhóm hàng, nhưng tôi muốn lấy tất cả. Tất cả những gì tôi biết là tên hoặc mẫu biểu thức chính quy cho tiêu đề.

Cách duy nhất tôi biết đọc tệp là cách "cho dòng trong tệp:", nhưng tôi không biết cách lấy các dòng SAU KHI dòng tôi hiện đang ở. Hy vọng điều này có ý nghĩa, và cảm ơn sự giúp đỡ!

* Cảm ơn mọi phản hồi! Tôi đã cố gắng thực hiện một số giải pháp, nhưng vấn đề của tôi là không phải tất cả các tiêu đề đều có cùng tên, và tôi không chắc chắn cách làm việc xung quanh nó. Tôi cần một biểu thức chính quy khác nhau cho mỗi ... bất kỳ gợi ý nào? *

+0

Để phản hồi chỉnh sửa của bạn: bạn cần phải có cách xác định dòng nào là tiêu đề. Bạn có thể cung cấp một số ví dụ thực tế không? –

+0

Chắc chắn, dưới đây là một số cụm từ thông dụng tôi đang sử dụng để xác định tiêu đề, được phân cách bởi //: '[0-9] + các phần tử phổ biến:' // '[0-9] + mô hình với các phần tử [0-9]: '//' Mô hình mẫu_ [0-9] el_ [0-9] ' – toofly

+0

Đừng nhầm lẫn vấn đề này (tiêu đề và chi tiết) với vấn đề thứ hai - và chỉ một phần liên quan. Không cập nhật thông tin này để thêm nhầm lẫn. Đầu tiên: Tìm kiếm SO cho trợ giúp biểu thức chính quy. Thứ hai: Tìm kiếm các hướng dẫn Python để được trợ giúp biểu thức chính quy. Thứ ba: sau khi thử mã không hoạt động, tạo câu hỏi ** mới ** chỉ tập trung vào vấn đề biểu thức chính quy của bạn. Với mã. Điều đó không hiệu quả. –

Trả lời

7

Generator Chức năng

def group_by_heading(some_source): 
    buffer= [] 
    for line in some_source: 
     if line.startswith("Heading"): 
      if buffer: yield buffer 
      buffer= [ line ] 
     else: 
      buffer.append(line) 
    yield buffer 

with open("some_file", "r") as source: 
    for heading_and_lines in group_by_heading(source): 
     heading= heading_and_lines[0] 
     lines= heading_and_lines[1:] 
     # process away. 
+0

+1, nhưng tôi nghĩ bạn có nghĩa là 'buffer = [line]' thay vì 'buffer = [heading]'. –

+0

Cảm ơn bạn! Đây là một giải pháp tuyệt vời (đã phải làm một số đọc lên trên các chức năng máy phát điện). – toofly

+0

@toofly: Nếu bạn chấp nhận câu trả lời của S.Lott, bạn sẽ đạt được cả hai điểm danh tiếng. –

0

tôi không thực sự biết Python, nhưng đây là một chút của giả.

int header_found = 0;

[bắt đầu từ đâu loop nơi bạn đang Looping qua dòng file]

if (header_found == 1) [lấy dòng]; header_found = 0;

nếu (dòng = ~/[regexp cho tiêu đề] /) header_found = 1;

Ý tưởng là có một biến theo dõi xem bạn có tìm thấy tiêu đề hay không và nếu bạn có, để lấy dòng tiếp theo.

4

Bạn có thể sử dụng một biến để đánh dấu nơi mà tiêu đề bạn đang theo dõi, và nếu nó được thiết lập, lấy mỗi dòng cho đến khi bạn tìm tiêu đề khác:

data = {} 
for line in file: 
    line = line.strip() 
    if not line: continue 

    if line.startswith('Heading '): 
     if line not in data: data[line] = [] 
     heading = line 
     continue 

    data[heading].append(line) 

Dưới đây là một đoạn http://codepad.org cho thấy cách thức hoạt động : http://codepad.org/KA8zGS9E

Sửa: Nếu bạn không quan tâm đến các giá trị tiêu đề thực tế và chỉ muốn có một danh sách ở cuối, bạn có thể sử dụng này:

data = [] 
for line in file: 
    line = line.strip() 
    if not line: continue 

    if line.startswith('Heading '): 
     continue 

    data.append(line) 

Về cơ bản, bạn không thực sự cần theo dõi biến cho tiêu đề, thay vào đó bạn có thể lọc ra tất cả các dòng khớp với mẫu Tiêu đề.

1

Khác với máy phát điện, tôi nghĩ chúng ta có thể tạo ra một dict trong đó khóa là "Heading" và giá trị là một danh sách để lưu các dòng. Đây là mã số

odd_map = {} 
odd_list = [] 
with open(file, 'r') as myFile: 
    lines = myFile.readlines() 
    for line in lines: 
     if "Heading" in line: 
      odd_list = [] 
      odd_map[line.strip()] = odd_list 
     else:  
      odd_list.append(line.strip()) 

for company, odds in odd_map.items(): 
    print(company) 
    for odd in odds: 
     print(odd) 
Các vấn đề liên quan