Issue #25523: Correct "a" article to "an" article

This changes the main documentation, doc strings, source code comments, and a
couple error messages in the test suite. In some cases the word was removed
to fix the grammar.
diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst
index 04c7e27..d31fa0a 100644
--- a/Doc/library/chunk.rst
+++ b/Doc/library/chunk.rst
@@ -48,7 +48,7 @@
 the :class:`Chunk` class defined here is to instantiate an instance at the start
 of each chunk and read from the instance until it reaches the end, after which a
 new instance can be instantiated. At the end of the file, creating a new
-instance will fail with a :exc:`EOFError` exception.
+instance will fail with an :exc:`EOFError` exception.
 
 
 .. class:: Chunk(file[, align, bigendian, inclheader])
diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst
index ead6b7a..c6bf3ef 100644
--- a/Doc/library/difflib.rst
+++ b/Doc/library/difflib.rst
@@ -276,7 +276,7 @@
    generating the delta lines) in unified diff format.
 
    Unified diffs are a compact way of showing just the lines that have changed plus
-   a few lines of context.  The changes are shown in a inline style (instead of
+   a few lines of context.  The changes are shown in an inline style (instead of
    separate before/after blocks).  The number of context lines is set by *n* which
    defaults to three.
 
diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst
index 3ab7b3b..b155daf 100644
--- a/Doc/library/ftplib.rst
+++ b/Doc/library/ftplib.rst
@@ -283,9 +283,9 @@
 
 .. method:: FTP.transfercmd(cmd[, rest])
 
-   Initiate a transfer over the data connection.  If the transfer is active, send a
+   Initiate a transfer over the data connection.  If the transfer is active, send an
    ``EPRT`` or  ``PORT`` command and the transfer command specified by *cmd*, and
-   accept the connection.  If the server is passive, send a ``EPSV`` or ``PASV``
+   accept the connection.  If the server is passive, send an ``EPSV`` or ``PASV``
    command, connect to it, and start the transfer command.  Either way, return the
    socket for the connection.
 
diff --git a/Doc/library/io.rst b/Doc/library/io.rst
index d3cdbf1..633a6af 100644
--- a/Doc/library/io.rst
+++ b/Doc/library/io.rst
@@ -221,7 +221,7 @@
    Even though :class:`IOBase` does not declare :meth:`read`, :meth:`readinto`,
    or :meth:`write` because their signatures will vary, implementations and
    clients should consider those methods part of the interface.  Also,
-   implementations may raise a :exc:`IOError` when operations they do not
+   implementations may raise an :exc:`IOError` when operations they do not
    support are called.
 
    The basic type used for binary data read from or written to a file is
diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst
index dfb43a1..c1ed15b 100644
--- a/Doc/library/optparse.rst
+++ b/Doc/library/optparse.rst
@@ -1327,7 +1327,7 @@
    the list of arguments to process (default: ``sys.argv[1:]``)
 
 ``values``
-   a :class:`optparse.Values` object to store option arguments in (default: a
+   an :class:`optparse.Values` object to store option arguments in (default: a
    new instance of :class:`Values`) -- if you give an existing object, the
    option defaults will not be initialized on it
 
diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst
index 5d7edd1..99a36af 100644
--- a/Doc/library/os.path.rst
+++ b/Doc/library/os.path.rst
@@ -256,7 +256,7 @@
 .. function:: samefile(path1, path2)
 
    Return ``True`` if both pathname arguments refer to the same file or directory
-   (as indicated by device number and i-node number). Raise an exception if a
+   (as indicated by device number and i-node number). Raise an exception if an
    :func:`os.stat` call on either pathname fails.
 
    Availability: Unix.
diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst
index 5b2808d..b6e7689 100644
--- a/Doc/library/smtplib.rst
+++ b/Doc/library/smtplib.rst
@@ -22,7 +22,7 @@
 
 .. class:: SMTP([host[, port[, local_hostname[, timeout]]]])
 
-   A :class:`SMTP` instance encapsulates an SMTP connection.  It has methods
+   An :class:`SMTP` instance encapsulates an SMTP connection.  It has methods
    that support a full repertoire of SMTP and ESMTP operations. If the optional
    host and port parameters are given, the SMTP :meth:`connect` method is
    called with those parameters during initialization.  If specified,
@@ -45,7 +45,7 @@
 
 .. class:: SMTP_SSL([host[, port[, local_hostname[, keyfile[, certfile[, timeout]]]]]])
 
-   A :class:`SMTP_SSL` instance behaves exactly the same as instances of
+   An :class:`SMTP_SSL` instance behaves exactly the same as instances of
    :class:`SMTP`. :class:`SMTP_SSL` should be used for situations where SSL is
    required from the beginning of the connection and using :meth:`starttls` is
    not appropriate. If *host* is not specified, the local host is used. If
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index f79eba6..73b5d5c 100644
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -757,7 +757,7 @@
    Set blocking or non-blocking mode of the socket: if *flag* is 0, the socket is
    set to non-blocking, else to blocking mode.  Initially all sockets are in
    blocking mode.  In non-blocking mode, if a :meth:`recv` call doesn't find any
-   data, or if a :meth:`send` call can't immediately dispose of the data, a
+   data, or if a :meth:`send` call can't immediately dispose of the data, an
    :exc:`error` exception is raised; in blocking mode, the calls block until they
    can proceed. ``s.setblocking(0)`` is equivalent to ``s.settimeout(0.0)``;
    ``s.setblocking(1)`` is equivalent to ``s.settimeout(None)``.
diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst
index f897234..2b730e8 100644
--- a/Doc/library/sqlite3.rst
+++ b/Doc/library/sqlite3.rst
@@ -583,7 +583,7 @@
    .. attribute:: lastrowid
 
       This read-only attribute provides the rowid of the last modified row. It is
-      only set if you issued a ``INSERT`` statement using the :meth:`execute`
+      only set if you issued an ``INSERT`` statement using the :meth:`execute`
       method. For operations other than ``INSERT`` or when :meth:`executemany` is
       called, :attr:`lastrowid` is set to :const:`None`.
 
diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst
index 4bdb99b..5d57d4b 100644
--- a/Doc/library/sunau.rst
+++ b/Doc/library/sunau.rst
@@ -54,8 +54,8 @@
 
    Note that it does not allow read/write files.
 
-   A *mode* of ``'r'`` returns a :class:`AU_read` object, while a *mode* of ``'w'``
-   or ``'wb'`` returns a :class:`AU_write` object.
+   A *mode* of ``'r'`` returns an :class:`AU_read` object, while a *mode* of ``'w'``
+   or ``'wb'`` returns an :class:`AU_write` object.
 
 
 .. function:: openfp(file, mode)
diff --git a/Doc/library/webbrowser.rst b/Doc/library/webbrowser.rst
index f74b89f..03c5713 100644
--- a/Doc/library/webbrowser.rst
+++ b/Doc/library/webbrowser.rst
@@ -20,7 +20,7 @@
 the user exits the browser.
 
 If the environment variable :envvar:`BROWSER` exists, it is interpreted to
-override the platform default list of browsers, as a :data:`os.pathsep`-separated
+override the platform default list of browsers, as an :data:`os.pathsep`-separated
 list of browsers to try in order.  When the value of a list part contains the
 string ``%s``, then it is  interpreted as a literal browser command line to be
 used with the argument URL substituted for ``%s``; if the part does not contain