แนะนำตัว...
ฉันจะแสดงวิธีการสองสามวิธีในการดึงข้อมูลที่ต้องการ/ฟิลด์จากสตริงที่มีโครงสร้าง วิธีการเหล่านี้จะช่วยในกรณีที่รูปแบบของโครงสร้างการป้อนข้อมูลอยู่ในรูปแบบที่รู้จัก
ทำอย่างไร..
1. ให้เราสร้างรูปแบบจำลองขึ้นมาเพื่อทำความเข้าใจแนวทาง
Report: <> - Time: <> - Player: <> - Titles: - Country: <>
รายงาน:Daily_Report - เวลา:2020-10-16T01:01:01.000001 - ผู้เล่น:Federer - ตำแหน่ง: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 module เพื่อทำให้ง่ายขึ้นเล็กน้อย ตามที่คุณเห็นรูปแบบสร้างเทมเพลต เราสามารถใช้ parse module เพื่อทำสิ่งนี้ได้ง่ายขึ้นเล็กน้อย
ขั้นแรกให้ติดตั้งโมดูล parse โดย - pip install 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
บทสรุป :
คุณได้เห็นวิธีการสองวิธีในการแยกวิเคราะห์ข้อมูลที่จำเป็นจากไฟล์บันทึก ต้องการกำหนดเทมเพลตและใช้โมดูลการแยกวิเคราะห์เพื่อดึงข้อมูลที่ต้องการ