2016-01-02 30 views
6

Tôi có một cuốn sách trong một tệp văn bản và tôi cần in đoạn đầu tiên của mỗi phần. Tôi nghĩ rằng nếu tôi tìm thấy một văn bản giữa \ n \ n và \ n tôi có thể tìm thấy câu trả lời của mình. Đây là mã của tôi và nó không hoạt động. Bạn có thể nói với tôi rằng tôi đang ở đâu sai?in đoạn đầu tiên trong python

lines = [line.rstrip('\n') for line in open('G:\\aa.txt')] 

check = -1 
first = 0 
last = 0 

for i in range(len(lines)): 
    if lines[i] == "": 
      if lines[i+1]=="": 
       check = 1 
       first = i +2 
    if i+2< len(lines): 
     if lines[i+2] == "" and check == 1: 
      last = i+2 
while (first < last): 
    print(lines[first]) 
    first = first + 1 

Ngoài ra tôi cũng tìm thấy mã trong stackoverflow Tôi đã thử nó quá nhưng nó chỉ in một mảng trống.

f = open("G:\\aa.txt").readlines() 
flag=False 
for line in f: 
     if line.startswith('\n\n'): 
      flag=False 
     if flag: 
      print(line) 
     elif line.strip().endswith('\n'): 
      flag=True 

Tôi đã chia sẻ một phần mẫu của cuốn sách này.

tôi

THE LAY CỦA ĐẤT

Có một lĩnh vực rộng lớn của sự quan tâm của con người hấp dẫn, nằm chỉ ngay bên ngoài cửa của chúng tôi, như được nêu ra đã được nhưng ít khám phá. Đó là Field of Animal Intelligence.

Trong tất cả các loại quan tâm gắn liền với nghiên cứu động vật hoang dã trên thế giới, không có gì vượt qua nghiên cứu về tâm trí, đạo đức của họ và hành vi mà họ thực hiện như kết quả của quá trình tâm thần của họ.

II

Wild Animal TÍNH & cá tính

Những gì tôi đang cố gắng để làm ở đây là, tìm ra dòng chữ hoa, và đặt chúng tất cả trong một mảng. Sau đó, bằng cách sử dụng phương pháp chỉ mục, tôi sẽ tìm đoạn đầu tiên và cuối cùng của mỗi phần bằng cách so sánh các chỉ mục của các phần tử này của mảng này mà tôi đã tạo.

Output nên như thế này:

Có một lĩnh vực rộng lớn của sự quan tâm của con người hấp dẫn, chỉ nằm ngay bên ngoài cửa của chúng tôi, như được nêu ra đã được nhưng ít khám phá. Đó là Field of Animal Intelligence.

Điều tôi đang cố gắng làm ở đây là, tìm các dòng chữ hoa và đặt tất cả vào một mảng. Sau đó, bằng cách sử dụng phương pháp chỉ mục, tôi sẽ tìm đoạn đầu tiên và cuối cùng của mỗi phần bằng cách so sánh các chỉ mục của các phần tử này của mảng này mà tôi đã tạo.

+0

bạn có thể thêm đầu vào thực tế như là và đầu ra dự kiến ​​không? –

Trả lời

6

Nếu bạn muốn nhóm các phần bạn có thể sử dụng itertools.groupby sử dụng dòng sản phẩm nào như delimiters:

from itertools import groupby 
with open("in.txt") as f: 
    for k, sec in groupby(f,key=lambda x: bool(x.strip())): 
     if k: 
      print(list(sec)) 

Với một số itertools hơn Foo chúng tôi có thể nhận được các phần sử dụng tiêu đề chữ hoa như delimiter:

from itertools import groupby, takewhile 

with open("in.txt") as f: 
    grps = groupby(f,key=lambda x: x.isupper()) 
    for k, sec in grps: 
     # if we hit a title line 
     if k: 
      # pull all paragraphs 
      v = next(grps)[1] 
      # skip two empty lines after title 
      next(v,""), next(v,"") 

      # take all lines up to next empty line/second paragraph 
      print(list(takewhile(lambda x: bool(x.strip()), v))) 

Trong đó sẽ cung cấp cho bạn:

['There is a vast field of fascinating human interest, lying only just outside our doors, which as yet has been but little explored. It is the Field of Animal Intelligence.\n'] 
['What I am trying to do here is, find the uppercase lines, and put them all in an array. Then, using the index method, I will find the first and last paragraphs of each section by comparing the indexes of these elements of this array I created.'] 

Sự bắt đầu của mỗi phần có một tiêu đề chữ hoa tất cả, vì vậy một khi chúng ta nhấn mà chúng ta biết có hai dòng trống thì đoạn đầu tiên và mẫu lặp lại.

Để phá vỡ nó vào sử dụng vòng:

from itertools import groupby 
from itertools import groupby 
def parse_sec(bk): 
    with open(bk) as f: 
     grps = groupby(f, key=lambda x: bool(x.isupper())) 
     for k, sec in grps: 
      if k: 
       print("First paragraph from section titled :{}".format(next(sec).rstrip())) 
       v = next(grps)[1] 
       next(v, ""),next(v,"") 
       for line in v: 
        if not line.strip(): 
         break 
        print(line) 

Đối với văn bản của bạn:

In [11]: cat -E in.txt 

THE LAY OF THE LAND$ 
$ 
$ 
There is a vast field of fascinating human interest, lying only just outside our doors, which as yet has been but little explored. It is the Field of Animal Intelligence.$ 
$ 
Of all the kinds of interest attaching to the study of the world's wild animals, there are none that surpass the study of their minds, their morals, and the acts that they perform as the results of their mental processes.$ 
$ 
$ 
WILD ANIMAL TEMPERAMENT & INDIVIDUALITY$ 
$ 
$ 
What I am trying to do here is, find the uppercase lines, and put them all in an array. Then, using the index method, I will find the first and last paragraphs of each section by comparing the indexes of these elements of this array I created. 

Các dấu hiệu đô la là những dòng mới, đầu ra là:

In [12]: parse_sec("in.txt") 
First paragraph from section titled :THE LAY OF THE LAND 
There is a vast field of fascinating human interest, lying only just outside our doors, which as yet has been but little explored. It is the Field of Animal Intelligence. 

First paragraph from section titled :WILD ANIMAL TEMPERAMENT & INDIVIDUALITY 
What I am trying to do here is, find the uppercase lines, and put them all in an array. Then, using the index method, I will find the first and last paragraphs of each section by comparing the indexes of these elements of this array I created. 
+0

Thật tuyệt, tôi có thể thấy từng phần bằng cách sử dụng mã này .. nhưng tôi chỉ muốn xem các đoạn đầu tiên của chúng .. Làm cách nào tôi có thể trích xuất? –

+0

@ TuğcanDemir, chính xác bạn muốn lấy gì từ inout trong câu hỏi của mình? –

+0

Tôi đã chỉnh sửa câu hỏi của mình. –

0

Đi qua mã bạn đã tìm thấy, từng dòng một.

f = open("G:\\aa.txt").readlines() 
flag=False 
for line in f: 
     if line.startswith('\n\n'): 
      flag=True 
     if flag: 
      print(line) 
     elif line.strip().endswith('\n'): 
      flag=True 

Dường như nó không bao giờ đặt biến cờ là đúng.

Và nếu bạn có thể chia sẻ một số mẫu từ sách của mình, sách sẽ hữu ích hơn cho mọi người.

+0

Tôi đã chia sẻ cùng một mã mà bạn đã chia sẻ, chỉ cần đặt cờ thành đúng vào đầu tiên nếu chặn. –

+0

Khi tôi đặt cờ đầu tiên thành true, nó sẽ thêm 2 dòng trống trên mỗi dòng. –

0

này nên làm việc, miễn là không có đoạn nào có mũ:

f = open('file.txt') 

    for line in f: 
    line = line.strip() 
    if line: 
     for c in line: 
      if c < 'A' or c > 'Z': # check for non-uppercase chars 
       break 
     else:  # means the line is made of all caps i.e. I, II, etc, meaning new section 
      f.readline() # discard chapter headers and empty lines 
      f.readline() 
      f.readline() 
      print(f.readline().rstrip()) # print first paragraph 

    f.close() 

Nếu bạn muốn nhận đoạn cuối cùng, bạn có thể theo dõi dòng cuối cùng có chứa ký tự chữ thường và sau đó ngay khi bạn tìm thấy tất cả dòng chữ hoa (I, II, v.v.) , sau đó bạn in dòng gần đây nhất, vì đó sẽ là đoạn cuối cùng trong phần trước.

+0

Nó in nhiều dòng trống giữa 2 câu rời rạc ... –

+0

@ TuğcanDemir Tôi đã thực hiện một vài thay đổi nhỏ để xóa các dòng trống và làm cho mã dễ đọc hơn. Mã này (và phiên bản trước đó) đã làm việc với mẫu bạn đã cung cấp ở trên. Bạn có thể cung cấp phần mẫu cho bạn những kết quả đó không? – TisteAndii

1

Luôn luôn có regex ....

import re 
with open("in.txt", "r") as fi: 
    data = fi.read() 
paras = re.findall(r""" 
        [IVXLCDM]+\n\n # Line of Roman numeral characters 
        [^a-z]+\n\n  # Line without lower case characters 
        (.*?)\n   # First paragraph line 
        """, data, re.VERBOSE) 
print "\n\n".join(paras) 
+0

Khuôn mẫu đang phát triển này: "Một số người, khi đối mặt với một vấn đề, hãy nghĩ rằng 'Tôi biết, tôi sẽ sử dụng các biểu thức chính quy'. [Bây giờ họ có hai vấn đề] (http://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/). " '[IV] +' huh? – msw

+0

Làm cách nào để in đoạn đầu tiên thay vì dòng đầu tiên? –

+0

vì vậy, tôi cũng tìm cách sử dụng mã của bạn .. cảm ơn bạn rất nhiều :) –

0

TXR giải pháp

 
$ txr firstpar.txr data 
There is a vast field of fascinating human interest, lying only just outside our doors, which as yet has been but little explored. It is the Field of Animal Intelligence. 
What I am trying to do here is, find the uppercase lines, and put them all in an array. Then, using the index method, I will find the first and last paragraphs of each section by comparing the indexes of these elements of this array I created. 

Mã trong firstpar.txr:

 
@(repeat) 
@num 

@title 

@firstpar 
@ (require (and (< (length num) 5) 
       [some title chr-isupper] 
       (not [some title chr-islower]))) 
@ (do (put-line firstpar)) 
@(end) 

Về cơ bản chúng tôi đang tìm kiếm các đầu vào cho một mô hình phù hợp cho mẫu đa dòng ba phần tử gắn với num, titlefirstpar biến. Bây giờ mô hình này, như vậy, có thể phù hợp ở những nơi sai, do đó, thêm một số hạn chế heuristics với một xác nhận require. Số phần được yêu cầu là một dòng ngắn và dòng tiêu đề phải chứa một số chữ hoa và không có chữ thường. Biểu thức này được viết bằng TXR Lisp.

Nếu chúng tôi khớp với ràng buộc này thì chúng tôi sẽ xuất chuỗi được ghi trong biến số firstpar.

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