U
    sVc                     @  sl   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ erXd dlmZ G dd	 d	eZd
S )    )annotations)TYPE_CHECKING)
ReadBuffer)import_optional_dependency)
is_integer)
ParserBase)	DataFramec                      sV   e Zd ZdZddd fddZdd Zd	d
 ZdddddZddddZ  Z	S )ArrowParserWrapperz7
    Wrapper for the pyarrow engine for read_csv()
    zReadBuffer[bytes]None)srcreturnc                   s$   t  | || _|| _|   d S )N)super__init__kwdsr   _parse_kwds)selfr   r   	__class__ J/tmp/pip-unpacked-wheel-xj8nt62q/pandas/io/parsers/arrow_parser_wrapper.pyr      s    zArrowParserWrapper.__init__c                 C  sf   | j d}|dkrdn|| _| | j d \| _| _| j d }t|trRtdt	| j d | _
dS )z?
        Validates keywords before passing to pyarrow.
        encodingNzutf-8usecols	na_valuesz?The pyarrow engine doesn't support passing a dict for na_values)r   getr   Z_validate_usecols_argr   Zusecols_dtype
isinstancedict
ValueErrorlistr   )r   r   r   r   r   r   r      s    

zArrowParserWrapper._parse_kwdsc                 C  s   ddddd}|  D ]4\}}|| jkr| j|dk	r| j|| j|< qdd | j  D | _d	d | j  D | _| jdk| jdk	r| jn| jd
 d| _dS )z:
        Rename some arguments to pass to pyarrow
        include_columnsnull_valuesescape_charignore_empty_lines)r   r   
escapecharZskip_blank_linesNc                 S  s&   i | ]\}}|d k	r|dkr||qS )N)	delimiter
quote_charr    r!   r   .0Zoption_nameZoption_valuer   r   r   
<dictcomp>;   s    z;ArrowParserWrapper._get_pyarrow_options.<locals>.<dictcomp>c                 S  s&   i | ]\}}|d k	r|dkr||qS )N)r   r   Ztrue_valuesZfalse_valuesr   r%   r   r   r   r'   B   s    Zskiprows)Zautogenerate_column_namesZ	skip_rows)itemsr   r   popparse_optionsconvert_optionsheaderread_options)r   mappingZpandas_nameZpyarrow_namer   r   r   _get_pyarrow_options-   s&    z'ArrowParserWrapper._get_pyarrow_optionsr   )framer   c              
     s  t |j}d} jdkr jdkrZ jdk	rF fddt|D  _n jdkrZt| _t  j|krtt|t  j  j  _d} j|_ |j|\|_} jdk	r4t	 jD ]<\}}t
|r|j|  j|< q||jkrtd| dq|j jddd  jdkr4|s4dgt |jj |j_ jd	dk	rz| jd	}W n, tk
r } zt|W 5 d}~X Y nX |S )
z
        Processes data read in based on kwargs.

        Parameters
        ----------
        frame: DataFrame
            The DataFrame to process.

        Returns
        -------
        DataFrame
            The processed DataFrame.
        TNc                   s   g | ]} j  | qS r   )prefix)r&   ir   r   r   
<listcomp>c   s     z7ArrowParserWrapper._finalize_output.<locals>.<listcomp>FzIndex z invalid)ZdropZinplaceZdtype)lencolumnsr,   namesr1   ranger   Z_do_date_conversionsZ	index_col	enumerater   r   Z	set_indexindexr   r   Zastype	TypeError)r   r0   Znum_colsZmulti_index_namedr2   itemer   r3   r   _finalize_outputP   s8    






z#ArrowParserWrapper._finalize_output)r   c                 C  sT   t d}|   |j| j|jf | j|jf | j|jf | j	d}|
 }| |S )z
        Reads the contents of a CSV file into a DataFrame and
        processes it according to the kwargs passed in the
        constructor.

        Returns
        -------
        DataFrame
            The DataFrame created from the CSV file.
        zpyarrow.csv)r-   r*   r+   )r   r/   Zread_csvr   ZReadOptionsr-   ZParseOptionsr*   ZConvertOptionsr+   Z	to_pandasr>   )r   Zpyarrow_csvtabler0   r   r   r   read   s    zArrowParserWrapper.read)
__name__
__module____qualname____doc__r   r   r/   r>   r@   __classcell__r   r   r   r   r	      s   #5r	   N)
__future__r   typingr   Zpandas._typingr   Zpandas.compat._optionalr   Zpandas.core.dtypes.inferencer   Zpandas.io.parsers.base_parserr   Zpandasr   r	   r   r   r   r   <module>   s   