### Summary

lookup function fails - lookup('ansible.builtin.ini', ...)

Ansible ini is using the function 'readfp'  on Configmap this function was [removed ](https://issues.apache.org/jira/browse/SVN-4899#:~:text=Description,3.12%20(due%20October%202023).) on python 3.12


### Issue Type

Bug Report

### Component Name

ansible.builtin.ini

### Ansible Version

```console
$ ansible --version
ansible [core 2.15.3]
  config file = /home/liss/webnews/pyramid-rt4/ansible/ansible.cfg
  configured module search path = ['/home/liss/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/liss/.local/lib/python3.12/site-packages/ansible
  ansible collection location = /home/liss/webnews/pyramid-rt4/ansible/collections
  executable location = /home/liss/.local/bin/ansible
  python version = 3.12.0rc1 (main, Aug  6 2023, 17:56:34) [GCC 9.4.0] (/usr/bin/python3)
  jinja version = 3.1.2
  libyaml = True
```


### Configuration

```console
# if using a version older than ansible-core 2.12 you should omit the '-t all'
$ ansible-config dump --only-changed -t all
```


### OS / Environment

"Ubuntu 20.04.6 LTS" on WSL

### Steps to Reproduce

- name:
  set_fact:
    planning_service_monitor_consul_token: "{{ lookup('ansible.builtin.ini', 'consul_token', file='/tmp/pyr_tmp', section='Consul', allow_no_value=True) }}"


### Expected Results

Success

### Actual Results

```console
fatal: [localhost]: FAILED! =>
  msg: 'An unhandled exception occurred while running the lookup plugin ''ansible.builtin.ini''. Error was a <class ''AttributeError''>, original message: ''ConfigParser'' object has no attribute ''readfp''. ''ConfigParser'' object has no attribute ''readfp'''
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
path = self.find_file_in_search_path(variables, 'files', paramvals['file'])
            
            config = StringIO()
            
            if paramvals['type'] == "properties":
                config.write(u'[java_properties]\n')
                paramvals['section'] = 'java_properties'
            
            contents, show_data = self._loader._get_file_contents(path)
            contents = to_text(contents, errors='surrogate_or_strict', encoding=paramvals['encoding'])
            config.write(contents)
            config.seek(0, os.SEEK_SET)
            try:
                self.cp.readfp(config)
            except configparser.DuplicateOptionError as doe:
                raise AnsibleLookupError("Duplicate option in '{file}': {error}".format(file=paramvals['file'], error=to_native(doe)))
            try:
                var = self.get_value(key, paramvals['section'], paramvals['default'], paramvals['re'])
            except configparser.NoSectionError:
                raise AnsibleLookupError("No section '{section}' in {file}".format(section=paramvals['section'], file=paramvals['file']))
            if var is not None:
                if isinstance(var, MutableSequence):
                    for v in var:
                        ret.append(v)
                else:
                    ret.append(var)
        return ret