Trích xuất các cặp giá trị khóa từ json python

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

  • {
      "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"
    }
    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 đồ

Để trích xuất các cặp khóa-giá trị từ tài liệu biểu mẫu

  1. Đị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

  2. 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]
    
  3. Tại dấu nhắc lệnh, nhập lệnh sau. Thay thế

    {
      "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"
    }
    0 bằng tệp hình ảnh tài liệu mà bạn muốn phân tích

    textract_python_kv_parser.py file
  4. 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ố
      {
        "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"
      }
      3 cho [các] điểm đến của chuyến đi
    • 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ị
      {
        "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"
      }
      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
    """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[]
    Đưa ra một yêu cầu đơn giản với Google Maps API

    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

    {
      "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"
    }
    Đầ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

    Đố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

    {
      "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"
    }
    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ả.

    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

    ...
    
    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[]
    Đưa ra một yêu cầu phức tạp đối với Google Maps API

    Ôi mẹ kiếp

    textract_python_kv_parser.py file
    0Đầ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

    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à

    {
      "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 để 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

    textract_python_kv_parser.py file
    3trích xuất. py

    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ừ
      ...
      
      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[]
      0
    • 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
    textract_python_kv_parser.py file
    5Đầ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"
    }
    9

    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

    textract_python_kv_parser.py file
    7chính. py

    Chạy chức năng này sẽ dẫn đến đầu ra sau

    textract_python_kv_parser.py file
    8Đầ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

    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

    {
      "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"
    }
    0Phân tích mọi giá trị khác từ phản hồi JSON

    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ẻ

    {
      "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"
    }
    1Đầu ra

    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

    {
      "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 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

    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?

    {
      "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"
    }
    1Nhép hai danh sách vào một từ điển

    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ị

    {
      "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"
    }
    2Danh sách nén dẫn đến một từ điển

    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ất

    Cá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 = json

    Là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 JSON
    Tạo một từ điển ở dạng chuỗi để sử dụng làm JSON
    Sử dụng mô-đun JSON để chuyển đổi chuỗi của bạn thành từ điển
    Viết một lớp để tải dữ liệu từ chuỗi của bạn
    Khở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.

Chủ Đề