Read a file of coordinate information.

        Reads xyz-files.

        Args:
            inputfile (str):
            start_index (int):
            get_bonds (bool):
            nrows (int): Number of rows of file to read.
                Note that the first two rows are implicitly excluded.
            engine (str): Wrapper for argument of :func:`pandas.read_csv`.

        Returns:
            Cartesian:

def read_xyz(cls, buf, start_index=0, get_bonds=True,
                 nrows=None, engine=None):
        """Read a file of coordinate information.

        Reads xyz-files.

        Args:
            inputfile (str):
            start_index (int):
            get_bonds (bool):
            nrows (int): Number of rows of file to read.
                Note that the first two rows are implicitly excluded.
            engine (str): Wrapper for argument of :func:`pandas.read_csv`.

        Returns:
            Cartesian:
        """
        frame = pd.read_table(buf, skiprows=2, comment='#',
                              nrows=nrows,
                              delim_whitespace=True,
                              names=['atom', 'x', 'y', 'z'], engine=engine)

        remove_digits = partial(re.sub, r'[0-9]+', '')
        frame['atom'] = frame['atom'].apply(remove_digits)

        molecule = cls(frame)
        molecule.index = range(start_index, start_index + len(molecule))

        if get_bonds:
            molecule.get_bonds(use_lookup=False, set_lookup=True)
        return molecule