U
    f/ew'                     @  s   d Z ddlmZ ddlZddlZddlmZmZm	Z	m
Z
mZmZ ddlZddlmZ ddlmZmZmZmZmZ ddlmZmZmZmZ ddlmZ dd	lm Z  dd
l!m"Z" erddl#m$Z$ G dd dZ%dS )z3
Module for formatting output data into CSV files.
    )annotationsN)TYPE_CHECKINGAnyHashableIteratorSequencecast)writers)CompressionOptionsFilePathOrBufferFloatFormatType
IndexLabelStorageOptions)ABCDatetimeIndexABCIndexABCMultiIndexABCPeriodIndex)notna)Index)
get_handle)DataFrameFormatterc                   @  s  e Zd ZU ded< d^dddddddddddddddddddZeddddZeddddZedddd Zed!dd"d#Z	eddd$d%Z
dd&d'd(d)Zd*dd+d,Zd*dd-d.Zd*dd/d0Zddd1d2d3Zeddd4d5Zddd6d7d8Zdd9d:d;d<Zed=dd>d?Zed@ddAdBZed9ddCdDZedddEdFZedddGdHZedIddJdKZedLddMdNZdOddPdQZdOddRdSZdOddTdUZdVddWdXZdOddYdZZd9d9dOd[d\d]ZdS )_CSVFormatterz
np.ndarraycols ,Nwstrictinfer
"Tr   z/FilePathOrBuffer[str] | FilePathOrBuffer[bytes]strzSequence[Hashable] | NonezIndexLabel | Nonez
str | Noner
   z
int | Noneboolr   )	formatterpath_or_bufsepr   index_labelmodeencodingerrorscompressionquoting	chunksize	quotechardate_formatdoublequote
escapecharstorage_optionsc                 C  s   || _ | j j| _|| _|| _|	| _|| _|| _|| _| 	|| _
|| _|
pNtj| _| || _|| _|| _|prtj| _|| _| || _| || _d S N)fmtframeobjfilepath_or_bufferr'   r)   r&   r0   r$   _initialize_index_labelr%   r(   csvlibQUOTE_MINIMALr*   _initialize_quotecharr,   r.   r/   oslinesepline_terminatorr-   _initialize_columnsr   _initialize_chunksizer+   )selfr"   r#   r$   r   r%   r&   r'   r(   r)   r*   r<   r+   r,   r-   r.   r/   r0    r@   :/tmp/pip-unpacked-wheel-tiezk1ph/pandas/io/formats/csvs.py__init__0   s$    
zCSVFormatter.__init__)returnc                 C  s   | j jS r1   )r2   na_repr?   r@   r@   rA   rD   Z   s    zCSVFormatter.na_repzFloatFormatType | Nonec                 C  s   | j jS r1   )r2   float_formatrE   r@   r@   rA   rF   ^   s    zCSVFormatter.float_formatc                 C  s   | j jS r1   )r2   decimalrE   r@   r@   rA   rG   b   s    zCSVFormatter.decimalzbool | Sequence[str]c                 C  s   | j jS r1   )r2   headerrE   r@   r@   rA   rH   f   s    zCSVFormatter.headerc                 C  s   | j jS r1   )r2   indexrE   r@   r@   rA   rI   j   s    zCSVFormatter.indexr   )r%   rC   c                 C  s6   |dk	r2|d kr|   S t|tttjtfs2|gS |S )NF)_get_index_label_from_obj
isinstancelisttuplenpndarrayr   r?   r%   r@   r@   rA   r6   n   s    z$CSVFormatter._initialize_index_labelz	list[str]c                 C  s"   t | jjtr|  S |  S d S r1   )rK   r4   rI   r   _get_index_label_multiindex_get_index_label_flatrE   r@   r@   rA   rJ   w   s    z&CSVFormatter._get_index_label_from_objc                 C  s   dd | j jjD S )Nc                 S  s   g | ]}|pd qS r   r@   ).0namer@   r@   rA   
<listcomp>~   s     z<CSVFormatter._get_index_label_multiindex.<locals>.<listcomp>)r4   rI   namesrE   r@   r@   rA   rQ   }   s    z(CSVFormatter._get_index_label_multiindexc                 C  s   | j jj}|d krdgS |gS )Nr   )r4   rI   rU   rP   r@   r@   rA   rR      s    
z"CSVFormatter._get_index_label_flat)r,   rC   c                 C  s   | j tjkr|S d S r1   )r*   r7   
QUOTE_NONE)r?   r,   r@   r@   rA   r9      s    z"CSVFormatter._initialize_quotecharc                 C  s   t t| jjtS r1   )r!   rK   r4   columnsr   rE   r@   r@   rA   has_mi_columns   s    zCSVFormatter.has_mi_columns)r   rC   c                 C  sp   | j r|d k	rd}t||d k	rZt|tr<|jf | j}nt|}| jjd d |f | _| jj	}|jf | jS )Nz4cannot specify cols with a MultiIndex on the columns)
rZ   	TypeErrorrK   r   _format_native_types_number_formatrL   r4   locrY   )r?   r   msgZnew_colsr@   r@   rA   r=      s    
z CSVFormatter._initialize_columnsint)r+   rC   c                 C  s&   |d krdt | jpd pdS t|S )Ni    )lenr   r`   )r?   r+   r@   r@   rA   r>      s    z"CSVFormatter._initialize_chunksizezdict[str, Any]c                 C  s   | j | j| j| j| jdS )z7Dictionary used for storing number formatting settings.rD   rF   r-   r*   rG   rc   rE   r@   r@   rA   r]      s    zCSVFormatter._number_formatr   c                   s:    j j}t|ttfr6 jd k	r6t fdd|D }|S )Nc                   s$   g | ]}t |r| jnd qS rS   )r   strftimer-   )rT   xrE   r@   rA   rV      s     z+CSVFormatter.data_index.<locals>.<listcomp>)r4   rI   rK   r   r   r-   r   )r?   
data_indexr@   rE   rA   rf      s    zCSVFormatter.data_indexc                 C  s   | j rt| jddS dS d S )Nnlevelsra   r   )rI   getattrrf   rE   r@   r@   rA   rg      s    zCSVFormatter.nlevelsc                 C  s   t | jtttjtfS r1   )rK   rH   rM   rL   rN   rO   r   rE   r@   r@   rA   _has_aliases   s    zCSVFormatter._has_aliasesc                 C  s   t | jp| jS r1   )r!   ri   rH   rE   r@   r@   rA   _need_to_save_header   s    z!CSVFormatter._need_to_save_headerzSequence[Hashable]c                 C  sj   | j rVt| jtrtt| jt| jkrNtdt| j dt| j dqf| jS ntt	t
 | jS d S )NzWriting z cols but got z aliases)ri   rK   rH   r!   AssertionErrorrb   r   
ValueErrorr   r   r   rE   r@   r@   rA   
write_cols   s    zCSVFormatter.write_colszlist[Hashable]c                 C  sH   g }| j r*| jr*t| jts tt| j}| jr6| jrD|t| j7 }|S r1   )	rI   r%   rK   r   rk   rL   rZ   ri   rm   )r?   encoded_labelsr@   r@   rA   rn      s    
zCSVFormatter.encoded_labelsNonec              
   C  s`   t | j| j| j| j| j| jd6}tj|j	| j
| j| j| j| j| jd| _|   W 5 Q R X dS )z+
        Create the writer & save.
        )r'   r(   r)   r0   )lineterminator	delimiterr*   r.   r/   r,   N)r   r5   r&   r'   r(   r)   r0   r7   writerhandler<   r$   r*   r.   r/   r,   _save)r?   Zhandlesr@   r@   rA   save   s&    
zCSVFormatter.savec                 C  s   | j r|   |   d S r1   )rj   _save_header
_save_bodyrE   r@   r@   rA   rt     s    zCSVFormatter._savec                 C  s:   | j r| jr| j| j n|  D ]}| j| q$d S r1   )rZ   ri   rr   writerowrn    _generate_multiindex_header_rows)r?   rowr@   r@   rA   rv     s    zCSVFormatter._save_headerzIterator[list[Hashable]]c                 c  s   | j j}t|jD ]h}g }| jrd||j|  t| jt	rdt
| jdkrd|dgt
| jd   ||| |V  q| jrt| jdhkr| jdgt
|  V  d S )Nra   r   )r4   rY   rangerg   rI   appendrW   rK   r%   rL   rb   extendZ_get_level_valuesrn   set)r?   rY   iZcol_liner@   r@   rA   ry     s    z-CSVFormatter._generate_multiindex_header_rowsc                 C  s\   t | j}|| j d }t|D ]6}|| j }t|| j |}||krJ qX| || q d S )Nra   )rb   rf   r+   r{   min_save_chunk)r?   Znrowschunksr   start_iend_ir@   r@   rA   rw   $  s    

zCSVFormatter._save_body)r   r   rC   c                   sr   t ||}| jj| }|jjf | j  fddtt jD }| j	| j
f | j}t||| j| j| j d S )Nc                   s   g | ]}  |qS r@   )Ziget_values)rT   r   resr@   rA   rV   4  s     z,CSVFormatter._save_chunk.<locals>.<listcomp>)slicer4   ZilocZ_mgrZto_native_typesr]   r{   rb   itemsrf   r\   
libwritersZwrite_csv_rowsrg   r   rr   )r?   r   r   ZslicerZdfdataixr@   r   rA   r   .  s    
zCSVFormatter._save_chunk)r   r   NNr   Nr   r   Nr   Nr   NTNN) __name__
__module____qualname____annotations__rB   propertyrD   rF   rG   rH   rI   r6   rJ   rQ   rR   r9   rZ   r=   r>   r]   rf   rg   ri   rj   rm   rn   ru   rt   rv   ry   rw   r   r@   r@   r@   rA   r   -   sr   
                .*	

r   )&__doc__
__future__r   csvr7   r:   typingr   r   r   r   r   r   ZnumpyrN   Zpandas._libsr	   r   Zpandas._typingr
   r   r   r   r   Zpandas.core.dtypes.genericr   r   r   r   Zpandas.core.dtypes.missingr   Zpandas.core.indexes.apir   Zpandas.io.commonr   Zpandas.io.formats.formatr   r   r@   r@   r@   rA   <module>   s    	