печать нескольких разделов текста между двумя маркерами в python - PullRequest
0 голосов
/ 25 марта 2019

Я преобразовал эту страницу (списки команд для разных спортивных команд) из PDF в текст, используя этот код:

import PyPDF3
import sys
import tabula
import pandas as pd


#One method
pdfFileObj = open(sys.argv[1],'rb')
pdfReader = PyPDF3.PdfFileReader(pdfFileObj)

num_pages = pdfReader.numPages
count = 0
text = ""

while count < num_pages:
    pageObj = pdfReader.getPage(count)
    count +=1
    text += pageObj.extractText()

print(text)

Вывод выглядит так:

2019 SEASON 

PREMIER DIVISION SQUAD NUMBERS 
CLUB: BOHEMIANS

1

James Talbot

GK

2

Derek Pender 

DF

3

Darragh Leahy 

DF

.... some more names....

2019 SEASON 


PREMIER DIVISION SQUAD NUMBERS 
CLUB: CORK CITY 

1

Mark McNulty

GK

2

Colm Horgan

DF

3

Alan Bennett

DF
....some more names....


2019 SEASON 

PREMIER DIVISION SQUAD NUMBERS 
CLUB: DERRY CITY

1

Peter Cherrie

GK

2

Conor McDermott

DF

3

Ciaran Coll

DF

Я хотел преобразовать этот вывод в файл с разделителями табуляции с тремя столбцами: название команды, имя игрока и номер.Таким образом, для примера, который я привел, результат будет выглядеть следующим образом:

Bohemians   James Talbot  1
Bohemians   Derek Pender  2
Bohemians   Darragh Leahy 3
Cork City   Mark McNulty  1
Cork City   Colm Horgan   2
Cork City   Alan Bennett  3
Derry City  Peter Cherrie  1
Derry City  Conor McDermott  2
Derry City  Ciaran Coll  3

Я знаю, что мне нужно сначала (1) Разделить файл на разделы, основанные на команде, а затем (2) в каждом разделе команды;объедините каждое поле имя + номер в пары, чтобы присвоить каждому номеру имя.

Я написал этот небольшой фрагмент кода для разбора большого файла в каждой спортивной команде:

import sys
fileopen = open(sys.argv[1])
recording = False
for line in fileopen:
    if not recording:
        if line.startswith('PREMI'):
            recording = True
    elif line.startswith('2019 SEA'):
            recording = False
    else:   
        print(line)

Но яЯ застрял, потому что приведенный выше код не будет делить блок текста на команду (т.е. мне нужно несколько блоков текста, извлеченных для разделения строк или списков?).Может кто-нибудь посоветовать, как разделить текстовый файл, который у меня есть на команду (так что в этом примере мне нужно оставить три блока текста ... и затем каким-то образом я могу работать над каждым блоком текста, разделенным на команды, на пары чисел иимена).

1 Ответ

0 голосов
/ 25 марта 2019

Оооочень не обязательно верно для формы, и я не принимаю во внимание другие библиотеки, которые вы использовали, но она была разработана, чтобы дать вам старт. Вы можете переформатировать его по своему усмотрению.

>>> string = '''2019 SEASON 

PREMIER DIVISION SQUAD NUMBERS 
CLUB: BOHEMIANS

1

James Talbot

GK

2

Derek Pender 

DF

3

Darragh Leahy 

DF

.... some more names....

2019 SEASON 


PREMIER DIVISION SQUAD NUMBERS 
CLUB: CORK CITY 

1

Mark McNulty

GK

2

Colm Horgan

DF

3

Alan Bennett

DF
....some more names....


2019 SEASON 

PREMIER DIVISION SQUAD NUMBERS 
CLUB: DERRY CITY

1

Peter Cherrie

GK

2

Conor McDermott

DF

3

Ciaran Coll

DF'''



>>> def reorder(string):
        import re
        headers = ['Team', 'Name', 'Number']
        print('\n')
        print(headers)
        print()
        paragraphs = re.findall('2019[\S\s]+?(?=2019|$)', string)
        for paragraph in paragraphs:
            club = re.findall('(?i)CLUB:[\s]*([\S\s]+?)\n', paragraph)
            names_numbers = re.findall('(?i)([\d]+)[\n]{1,3}[\s]*([\S\ ]+)', paragraph)
            for i in range(len(names_numbers)):
                if len(club) == 1:
                    print(club[0]+' | '+names_numbers[i][1]+' | '+names_numbers[i][0])




>>> reorder(string)


['Team', 'Name', 'Number']

BOHEMIANS | James Talbot | 1
BOHEMIANS | Derek Pender  | 2
BOHEMIANS | Darragh Leahy  | 3
CORK CITY  | Mark McNulty | 1
CORK CITY  | Colm Horgan | 2
CORK CITY  | Alan Bennett | 3
DERRY CITY | Peter Cherrie | 1
DERRY CITY | Conor McDermott | 2
DERRY CITY | Ciaran Coll | 3
...