Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 구조화된 문자열에서 필요한 데이터를 추출하는 방법은 무엇입니까?

<시간/>

소개...

구조화된 문자열에서 필수 데이터/필드를 추출하는 몇 가지 방법을 보여 드리겠습니다. 이러한 접근 방식은 입력 구조의 형식이 알려진 형식인 경우 도움이 됩니다.

그것을 하는 방법..

1. 접근 방식을 이해하기 위해 하나의 더미 형식을 만들어 보겠습니다.

Report: <> - Time: <> - Player: <> - Titles: - Country: <>

보고서:Daily_Report - 시간:2020-10-16T01:01:01.000001 - 선수:페더러 - 타이틀:20 - 국가:스위스

report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland'

2. 보고서에서 가장 먼저 눈에 띄는 것은 구분 기호가 "-"인 것입니다. 계속해서 보고서를 "-"로 구문 분석하겠습니다.

fields = report.split(' - ')
name, time, player , titles, _ = fields

print(f"Output \n *** The report name {name} generated on {time} has {titles} titles for {player}. ")

출력

*** The report name Report: Daily_Report generated on Time: 2020-10-10T12:30:59.000000 has Titles: 20 titles for Player: Federer.

3. 이제 필요하지 않은 Report:, Time:, Player:와 같은 일부 레이블을 볼 수 있는 것처럼 이제 출력이 예상대로 되지 않습니다.

# extract only report name
formatted_name = name.split(':')[1]

# extract only player
formatted_player = player.split(':')[1]

# extract only titles
formatted_titles = int(titles.split(':')[1])

# extract only titles
new_time = time.split(': ')[1]

print(f"Output \n {formatted_name} , {new_time}, {formatted_player} , {formatted_titles}")

출력

Daily_Report , 2020-10-10T12:30:59.000000, Federer , 20

4. 이제 타임스탬프가 ISO 형식이므로 원하는 경우 분할하거나 그대로 둘 수 있습니다. 타임스탬프 필드를 분할하는 방법을 보여드리겠습니다.

from datetime import datetime
formatted_date = datetime.fromisoformat(new_time)

print(f"Output \n{formatted_date}")

출력

2020-10-10 12:30:59
  • 이제 이 모든 단계를 단일 함수로 결합합니다.

def parse_function(log):
"""
Function : Parse the given log in the format
Report: <> - Time: <> - Player: <> - Titles: - Country: <>
Args : log
Return : required data
"""
fields = log.split(' - ')
name, time, player , titles, _ = fields

# extract only report name
formatted_name = name.split(':')[1]

# extract only player
formatted_player = player.split(':')[1]

# extract only titles
formatted_titles = int(titles.split(':')[1])

# extract only titles
new_time = time.split(': ')[1]

return f"{formatted_name} , {new_time}, {formatted_player} , {formatted_titles}"

if __name__ == '__main__':
report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland'
data = parse_function(report)
print(f"Output \n{data}")

출력

Daily_Report , 2020-10-10T12:30:59.000000, Federer , 20

6. parse 모듈을 사용하여 좀 더 간단하게 만들 수 있습니다. 보시다시피 형식은 템플릿을 만듭니다. 우리는 이것을 좀 더 쉽게 하기 위해 parse 모듈을 사용할 수 있습니다.

먼저 pip install parse

로 parse 모듈을 설치합니다.
from parse import parse
report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland'

# Looking at the report, create a template
template = 'Report: {name} - Time: {time} - Player: {player} - Titles: {titles} - Country: {country}'

# Run parse and check the results
data = parse(template, report)
print(f"Output \n{data}")

출력

<Result () {'name': 'Daily_Report', 'time': '2020-10-10T12:30:59.000000', 'player': 'Federer', 'titles': '20', 'country': 'Switzerland'}>

7. 간단한 하나의 라이너로 템플릿을 정의하여 로그에서 데이터를 추출할 수 있습니다. 이제 개별 값을 추출해 보겠습니다.

print(f"Output \n {data['name']} - {data['time']} - {data['player']} - {data['titles']} - {data['country']}")

출력

Daily_Report - 2020-10-10T12:30:59.000000 - Federer - 20 - Switzerland

결론:

로그 파일에서 필요한 데이터를 구문 분석하는 몇 가지 방법을 보았습니다. 템플릿을 정의하고 구문 분석 모듈을 사용하여 필요한 데이터를 추출하는 것을 선호합니다.