Ví dụ Python sau đây cho thấy cách trích xuất các cặp khóa-giá trị trong tài liệu biểu mẫu từ các đối tượng Khối được lưu trữ trong bản đồ. Các đối tượng khối được trả về từ lệnh gọi tới AnalyzeDocument. Để biết thêm thông tin, hãy xem Dữ liệu biểu mẫu [Cặp khóa-giá trị]
Bạn sử dụng các chức năng sau
7 – Gọi AnalyzeDocument và lưu trữ các đối tượng KEY và VALUE BLOCK trong bản đồ{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
8 và{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
9 – Xây dựng mối quan hệ khóa-giá trị từ bản đồ{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Để trích xuất các cặp khóa-giá trị từ tài liệu biểu mẫu
Định cấu hình môi trường của bạn. Để biết thêm thông tin, xem Điều kiện tiên quyết
Lưu mã ví dụ sau vào tệp có tên textract_python_kv_parser. py
import boto3 import sys import re import json from collections import defaultdict def get_kv_map[file_name]: with open[file_name, 'rb'] as file: img_test = file.read[] bytes_test = bytearray[img_test] print['Image loaded', file_name] # process using image bytes client = boto3.client['textract'] response = client.analyze_document[Document={'Bytes': bytes_test}, FeatureTypes=['FORMS']] # Get the text blocks blocks = response['Blocks'] # get key and value maps key_map = {} value_map = {} block_map = {} for block in blocks: block_id = block['Id'] block_map[block_id] = block if block['BlockType'] == "KEY_VALUE_SET": if 'KEY' in block['EntityTypes']: key_map[block_id] = block else: value_map[block_id] = block return key_map, value_map, block_map def get_kv_relationship[key_map, value_map, block_map]: kvs = defaultdict[list] for block_id, key_block in key_map.items[]: value_block = find_value_block[key_block, value_map] key = get_text[key_block, block_map] val = get_text[value_block, block_map] kvs[key].append[val] return kvs def find_value_block[key_block, value_map]: for relationship in key_block['Relationships']: if relationship['Type'] == 'VALUE': for value_id in relationship['Ids']: value_block = value_map[value_id] return value_block def get_text[result, blocks_map]: text = '' if 'Relationships' in result: for relationship in result['Relationships']: if relationship['Type'] == 'CHILD': for child_id in relationship['Ids']: word = blocks_map[child_id] if word['BlockType'] == 'WORD': text += word['Text'] + ' ' if word['BlockType'] == 'SELECTION_ELEMENT': if word['SelectionStatus'] == 'SELECTED': text += 'X ' return text def print_kvs[kvs]: for key, value in kvs.items[]: print[key, ":", value] def search_value[kvs, search_key]: for key, value in kvs.items[]: if re.search[search_key, key, re.IGNORECASE]: return value def main[file_name]: key_map, value_map, block_map = get_kv_map[file_name] # Get Key Value relationship kvs = get_kv_relationship[key_map, value_map, block_map] print["\n\n== FOUND KEY : VALUE pairs ===\n"] print_kvs[kvs] # Start searching a key value while input['\n Do you want to search a value for a key? [enter "n" for exit] '] != 'n': search_key = input['\n Enter a search key:'] print['The value is:', search_value[kvs, search_key]] if __name__ == "__main__": file_name = sys.argv[1] main[file_name]
Tại dấu nhắc lệnh, nhập lệnh sau. Thay thế
0 bằng tệp hình ảnh tài liệu mà bạn muốn phân tích{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
textract_python_kv_parser.py
file
Khi bạn được nhắc, hãy nhập khóa có trong tài liệu đầu vào. Nếu mã phát hiện khóa, nó sẽ hiển thị giá trị của khóa
Tất cả chúng ta đều là những người làm dữ liệu ở đây, vì vậy bạn đã biết kịch bản. Nó xảy ra 1 đến 100 lần mỗi ngày. Bạn bắt đầu làm việc với API REST mới và nó hoàn toàn phù hợp với nhu cầu của bạn. Thật dễ dàng để chuyển yêu cầu và phản hồi chứa tất cả thông tin bạn đang tìm kiếm
Tuy nhiên, chỉ có một vấn đề. sự phức tạp của các đối tượng JSON lồng nhau là vô tận, và đột nhiên công việc bạn yêu thích cần phải tạm dừng để truy xuất dữ liệu bạn muốn một cách tỉ mỉ, và đó là 5 cấp độ sâu trong địa ngục JSON lồng nhau. Không ai cảm thấy mình giống một "nhà khoa học" hay một "kỹ sư" khi nửa ngày của họ xử lý các lỗi giá trị quan trọng
May mắn thay, chúng tôi viết mã bằng Python. [được rồi, ngôn ngữ không tạo ra nhiều sự khác biệt ở đây. Nó giống như một cuộc gọi tập hợp vào thời điểm đó]
Sử dụng API Google Maps làm ví dụ
Để hình dung vấn đề, hãy lấy một ví dụ mà ai đó có thể muốn sử dụng. API Google Maps là một ứng cử viên sáng giá để phù hợp với hóa đơn tại đây
Mặc dù Google Maps là một tập hợp các API, nhưng Ma trận khoảng cách của Google Maps. Ý tưởng là với một lệnh gọi API duy nhất, người dùng có thể tính toán khoảng cách và thời gian di chuyển giữa điểm gốc và vô số điểm đến. Đó là một API đầy đủ tính năng tuyệt vời, nhưng như bạn có thể tưởng tượng, JSON kết quả để tính toán thời gian đi lại giữa nơi bạn đứng và mọi vị trí trong vũ trụ có thể hình dung được tạo nên một cấu trúc JSON cực kỳ phức tạp
Cảm nhận địa ngục JSON
Chúng tôi sẽ sử dụng API Google Maps để biết khoảng cách giữa hai địa điểm, cũng như thời gian ước tính để hoàn thành chuyến đi. Dưới đây chúng ta thấy một yêu cầu như vậy sẽ được thực hiện như thế nào thông qua thư viện yêu cầu của Python
Chúng ta cần truyền một số tham số
- nguồn gốc. Địa điểm [hoặc địa điểm] đại diện cho nơi chuyến đi của chúng tôi bắt đầu. Giá trị này có thể được chuyển dưới dạng tên thành phố, địa chỉ hoặc các định dạng khác;
- điểm đến. Tương đương với tham số
3 cho [các] điểm đến của chuyến đi{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
- Chìa khóa. Khóa API của Google
- transit_mode [Tùy chọn]. Phương thức vận chuyển cho chuyến đi [thông báo thời gian chuyến đi]
- đơn vị [Tùy chọn]. Có trả về giá trị dưới dạng đơn vị
4 hoặc{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
5 hay không{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Đưa ra một yêu cầu đơn giản với Google Maps API"""Fetch and extract JSON data from Google Maps.""" import requests from config import API_KEY def google_maps_distance[]: """Fetch distance between two points.""" endpoint = "//maps.googleapis.com/maps/api/distancematrix/json" params = { 'units': 'imperial', 'key': API_KEY, 'origins': 'New York City, NY', 'destinations': 'Philadelphia,PA', 'transit_mode': 'car' } resp = requests.get[endpoint, params=params] return resp.json[]
Vì chúng tôi đang xử lý một nguồn gốc và một đích duy nhất, phản hồi JSON kết quả cho yêu cầu này tương đối đơn giản
Đầu ra của{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
6{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Đối với mỗi điểm đến, chúng tôi nhận được hai điểm dữ liệu. khoảng cách đi lại và thời lượng ước tính. Nếu theo giả thuyết chúng tôi muốn trích xuất các giá trị đó, thì việc nhập
7 không quá điên rồ. Ý tôi là, nó hơi khủng khiếp và khiến người ta thường có ý nghĩ tự tử, nhưng không có gì khác thường cả.{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Bây giờ, hãy làm cho mọi thứ trở nên thú vị bằng cách thêm một vài điểm dừng nữa trong chuyến đi của chúng ta
Đưa ra một yêu cầu phức tạp đối với Google Maps API... def google_maps_distance[]: """Fetch distance between two points.""" endpoint = "//maps.googleapis.com/maps/api/distancematrix/json" params = { 'units': 'imperial', 'key': API_KEY, 'origins': 'New York City, NY', 'destinations': 'Washington,DC|Philadelphia,PA|Santa Barbara,CA|Miami,FL|Austin,TX|Napa County,CA', 'transit_mode': 'car' } resp = requests.get[endpoint, params=params] return resp.json[]
Ôi mẹ kiếp
0Đầu ra củatextract_python_kv_parser.py
file
6{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Rất nhiều điều đang xảy ra ở đây. Có những đối tượng. có danh sách. Có danh sách các đối tượng là một phần của đối tượng. Điều cuối cùng tôi muốn giải quyết là cố gắng phân tích dữ liệu này chỉ để vô tình nhận được một cặp khóa/giá trị vô dụng như "trạng thái". "VÂNG. "
Đoạn mã để giải cứu
Giả sử chúng ta chỉ muốn dữ liệu mà con người có thể đọc được từ JSON này, được gắn nhãn "văn bản" cho cả khoảng cách và thời lượng. Chúng tôi đã tạo một chức năng bên dưới có tên là
9 để giúp giải quyết vấn đề này. Chức năng này được dự định là linh hoạt và bất khả tri, do đó có thể được nhập dưới dạng mô-đun vào bất kỳ dự án nào bạn có thể cần{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
3trích xuất. pytextract_python_kv_parser.py
file
Chúng ta cần truyền cho hàm này hai giá trị
- Một từ điển Python phức tạp, chẳng hạn như phản hồi mà chúng tôi đã phân tích cú pháp từ
0... def google_maps_distance[]: """Fetch distance between two points.""" endpoint = "//maps.googleapis.com/maps/api/distancematrix/json" params = { 'units': 'imperial', 'key': API_KEY, 'origins': 'New York City, NY', 'destinations': 'Washington,DC|Philadelphia,PA|Santa Barbara,CA|Miami,FL|Austin,TX|Napa County,CA', 'transit_mode': 'car' } resp = requests.get[endpoint, params=params] return resp.json[]
- Tên của khóa từ điển chứa các giá trị chúng tôi muốn trích xuất
5Đầu ra củatextract_python_kv_parser.py
file
9{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Bất kể vị trí của khóa "văn bản" trong JSON, hàm này sẽ trả về mọi giá trị cho ví dụ về "khóa. " Đây là chức năng của chúng tôi trong hành động
7chính. pytextract_python_kv_parser.py
file
Chạy chức năng này sẽ dẫn đến đầu ra sau
8Đầu ra củatextract_python_kv_parser.py
file
6{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Oh fiddle me woods. Bởi vì Google API luân phiên giữa khoảng cách và thời lượng chuyến đi, mọi giá trị khác luân phiên giữa khoảng cách và thời gian [chúng ta có thể tạm dừng để đánh giá cao thiết kế tồi tệ này không? Có vô số cách tốt hơn để cấu trúc phản hồi này]. Đừng sợ, một số Python đơn giản có thể giúp chúng tôi chia danh sách này thành hai danh sách
0Phân tích mọi giá trị khác từ phản hồi JSON{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Thao tác này sẽ lấy một danh sách của chúng ta và chia nó thành hai danh sách, xen kẽ giữa chẵn và lẻ
1Đầu ra{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Sáng tạo với danh sách
Một chủ đề phổ biến mà tôi gặp phải khi trích xuất danh sách giá trị từ các đối tượng JSON như thế này là danh sách giá trị tôi trích xuất có liên quan rất nhiều. Trong ví dụ trên, với mỗi khoảng thời gian, chúng ta có một khoảng cách đi kèm, đó là cơ sở một đối một. Hãy tưởng tượng nếu chúng ta muốn liên kết những giá trị này bằng cách nào đó
Để sử dụng một ví dụ tốt hơn, gần đây tôi đã sử dụng hàm
9 của mình để tìm nạp danh sách tên cột và kiểu dữ liệu của chúng từ lược đồ cơ sở dữ liệu. Dưới dạng các danh sách riêng biệt, dữ liệu trông giống như thế này{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
0Hai danh sách liên quan{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Hai danh sách này có liên quan trực tiếp với nhau; . Làm thế nào điều này có thể hữu ích?
1Nhép hai danh sách vào một từ điển{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Tôi thích nghĩ rằng họ gọi nó là zip vì nó giống như kéo khóa kéo lên, trong đó mỗi bên của khóa kéo là một danh sách. Điều này xuất ra một từ điển trong đó danh sách 1 đóng vai trò là khóa và danh sách 2 đóng vai trò là giá trị
2Danh sách nén dẫn đến một từ điển{ "destination_addresses": [ "Philadelphia, PA, USA" ], "origin_addresses": [ "New York, NY, USA" ], "rows": [{ "elements": [{ "distance": { "text": "94.6 mi", "value": 152193 }, "duration": { "text": "1 hour 44 mins", "value": 6227 }, "status": "OK" }] }], "status": "OK" }
Và ở đó bạn có nó folks. một đoạn mã miễn phí để sao chép và bí mật giả vờ như bạn đã viết mãi mãi. Tôi đã đưa chức năng này lên Github Gists, nếu điều đó làm bạn hài lòng
Cách giải nén khóa
Để lấy dữ liệu từ đầu vào JSON. Tạo một quy trình mới. .Nhấp vào XÁC NHẬN để lưu cấu hình ánh xạ đầu ra. .Thêm hoạt động WriteLine bên dưới Hoạt động JSON và trong trường Văn bản, nhập chuỗi đầu ra để in chi tiết sách được truy xuấtCách lấy chìa khóa
Nhận tất cả khóa và giá trị từ đối tượng json trong Python .{"emp_details". [ {"Tên". "sự giúp đỡ". "123" }, {"tên". "đấu thầu". "345" } ] }dữ liệu = json. tải [Tệp json]jsonData = data["emp_details"] keys = x. keys[] giá trị = x. .nhập json với open["test. json"] dưới dạng jsonFile. dữ liệu = jsonLàm cách nào để trích xuất các giá trị từ tệp JSON trong Python?
Bài tập .Tạo một tệp Python mới nhập JSONTạo một từ điển ở dạng chuỗi để sử dụng làm JSONSử dụng mô-đun JSON để chuyển đổi chuỗi của bạn thành từ điểnViết một lớp để tải dữ liệu từ chuỗi của bạnKhởi tạo một đối tượng từ lớp của bạn và in một số dữ liệu từ nóLàm cách nào để trích xuất dữ liệu cụ thể từ tệp JSON?
Để trích xuất tên và thuộc tính dự án từ chuỗi JSON, hãy sử dụng hàm json_extract như trong ví dụ sau. Hàm json_extract lấy cột chứa chuỗi JSON và tìm kiếm nó bằng cách sử dụng biểu thức giống như JSONPath với dấu chấm. ký hiệu. JSONPath thực hiện duyệt cây đơn giản.