o
    IAf>                     @   s  	 d dl Z d dlmZmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlmZ g dZG dd dZG dd	 d	eZed	e G d
d deZede G dd deZede G dd dZG dd dZze W n ey   eZY nw G dd dZdS )    N)Error__version__writerreaderregister_dialectunregister_dialectget_dialectlist_dialectsfield_size_limitQUOTE_MINIMAL	QUOTE_ALLQUOTE_NONNUMERIC
QUOTE_NONE__doc__)Dialect)StringIO)r   r   r   r   r   r   r   excel	excel_tabr
   r   r   r   r   r	   Snifferr   r   
DictReader
DictWriterunix_dialectc                   @   sB   e Zd Z	 dZdZdZdZdZdZdZ	dZ
dZdd Zdd ZdS )r    FNc                 C   s   | j tkrd| _|   d S )NT)	__class__r   _valid	_validateself r   /usr/lib/python3.10/csv.py__init__*   s   
zDialect.__init__c              
   C   s4   zt |  W d S  ty } ztt|d }~ww N)_Dialect	TypeErrorr   str)r   er   r   r   r   /   s   zDialect._validate)__name__
__module____qualname___namer   	delimiter	quotecharZ
escapechardoublequoteskipinitialspacelineterminatorquotingr    r   r   r   r   r   r      s    r   c                   @   &   e Zd Z	 dZdZdZdZdZeZ	dS )r   ,"TF
N)
r&   r'   r(   r*   r+   r,   r-   r.   r   r/   r   r   r   r   r   6       r   c                   @   s   e Zd Z	 dZdS )r   	N)r&   r'   r(   r*   r   r   r   r   r   @   s    r   z	excel-tabc                   @   r0   )r   r1   r2   TF
N)
r&   r'   r(   r*   r+   r,   r-   r.   r   r/   r   r   r   r   r   E   r4   r   Zunixc                   @   sD   e Zd Z		dddZdd Zedd Zejd	d Zd
d ZdS )r   Nr   c                 O   s<   || _ || _|| _t||g|R i || _|| _d| _d S Nr   )_fieldnamesrestkeyrestvalr   dialectline_num)r   f
fieldnamesr9   r:   r;   argskwdsr   r   r   r    Q   s   
zDictReader.__init__c                 C   s   | S r!   r   r   r   r   r   __iter__Z   s   zDictReader.__iter__c                 C   s>   | j d u rzt| j| _ W n	 ty   Y nw | jj| _| j S r!   )r8   nextr   StopIterationr<   r   r   r   r   r>   ]   s   

zDictReader.fieldnamesc                 C   s
   || _ d S r!   )r8   )r   valuer   r   r   r>   g   s   
c                 C   s   | j dkr| j t| j}| jj | _ |g krt| j}|g kstt| j|}t| j}t|}||k r?||d  || j< |S ||krR| j|d  D ]}| j||< qJ|S r7   )	r<   r>   rB   r   dictziplenr9   r:   )r   rowdZlfZlrkeyr   r   r   __next__k   s"   




zDictReader.__next__)NNNr   )	r&   r'   r(   r    rA   propertyr>   setterrK   r   r   r   r   r   P   s    
	
	
r   c                   @   s:   e Zd Z		dddZdd Zdd	 Zd
d Zdd ZdS )r   r   raiser   c                 O   sH   || _ || _| dvrtd| || _t||g|R i || _d S )N)rN   ignorez-extrasaction (%s) must be 'raise' or 'ignore')r>   r:   lower
ValueErrorextrasactionr   )r   r=   r>   r:   rR   r;   r?   r@   r   r   r   r       s   zDictWriter.__init__c                 C   s   t t| j| j}| |S r!   )rE   rF   r>   writerow)r   headerr   r   r   writeheader   s   
zDictWriter.writeheaderc                    sN   j dkr  j }|rtdddd |D   fddjD S )NrN   z(dict contains fields not in fieldnames: z, c                 S      g | ]}t |qS r   )repr).0xr   r   r   
<listcomp>       z,DictWriter._dict_to_list.<locals>.<listcomp>c                 3   s    | ]
}  |jV  qd S r!   )getr:   )rX   rJ   rowdictr   r   r   	<genexpr>   s    z+DictWriter._dict_to_list.<locals>.<genexpr>)rR   keysr>   rQ   join)r   r^   Zwrong_fieldsr   r]   r   _dict_to_list   s   
zDictWriter._dict_to_listc                 C   s   | j | |S r!   )r   rS   rb   )r   r^   r   r   r   rS      s   zDictWriter.writerowc                 C   s   | j t| j|S r!   )r   	writerowsmaprb   )r   Zrowdictsr   r   r   rc      s   zDictWriter.writerowsN)r   rN   r   )r&   r'   r(   r    rU   rb   rS   rc   r   r   r   r   r      s    

r   c                   @   s8   e Zd Z	 dd ZdddZdd Zdd	 Zd
d ZdS )r   c                 C   s   g d| _ d S )N)r1   r5   ; :)	preferredr   r   r   r   r       s   zSniffer.__init__Nc                 C   sf   	 |  ||\}}}}|s| ||\}}|stdG dd dt}||_||_|p,d|_||_|S )NzCould not determine delimiterc                   @   s   e Zd ZdZdZeZdS )zSniffer.sniff.<locals>.dialectZsniffedr3   N)r&   r'   r(   r)   r.   r   r/   r   r   r   r   r;      s    r;   r2   )_guess_quote_and_delimiter_guess_delimiterr   r   r,   r*   r+   r-   )r   sample
delimitersr+   r,   r*   r-   r;   r   r   r   sniff   s   


zSniffer.sniffc              	   C   s  	 g }dD ]}t |t jt jB }||}|r nq|sdS i }i }d}|j}	|D ]\}
|	d d }|
| }|rB||dd ||< z|	d d }|
| }W n	 tyW   Y q*w |rl|d u sb||v rl||dd ||< z|	d d }W n	 ty}   Y q*w |
| r|d7 }q*t||jd}|rt||jd}|| |k}|d	krd
}nd
}d}t dt 	||d t j}|
|rd}nd}||||fS )N)zI(?P<delim>[^\w\n"\'])(?P<space> ?)(?P<quote>["\']).*?(?P=quote)(?P=delim)zG(?:^|\n)(?P<quote>["\']).*?(?P=quote)(?P<delim>[^\w\n"\'])(?P<space> ?)zG(?P<delim>[^\w\n"\'])(?P<space> ?)(?P<quote>["\']).*?(?P=quote)(?:$|\n)z-(?:^|\n)(?P<quote>["\']).*?(?P=quote)(?:$|\n))r   FNr   r   quote   delimspacerJ   r6   r   z]((%(delim)s)|^)\W*%(quote)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\W*((%(delim)s)|$))rp   rn   TF)recompileDOTALL	MULTILINEfindall
groupindexr\   KeyErrormaxescapesearch)r   datarl   matchesZrestrZregexpZquotesdelimsspacesrx   mnrJ   r+   rp   r-   Z	dq_regexpr,   r   r   r   ri      sl   

z"Sniffer._guess_quote_and_delimiterc                 C   s
  	 t td |d}dd tdD }tdt|}d}i }i }i }d|}	}
|	t|k r.|d7 }||	|
 D ] }|D ]}||i }||}||dd ||< |||< q=q9| D ]N}t || 	 }t|dkrw|d d dkrwq^t|dkrt
|dd	 d
||< |||  || d || d tdd |D  f||< q^|d ||< q^|	 }tt|| t|}d}d}t|dkr||kr|D ]$\}}|d dkr|d dkr|d | |kr|d u s||v r|||< q|d8 }t|dkr||kst|dkr"t | d }|d ||d d| k}||fS |
}	|
|7 }
|	t|k s/|s3dS t|dkr^| jD ] }|| v r\|d ||d d| k}||f  S q=dd |	 D }|  |d d }|d ||d d| k}||fS )Nr6   c                 S   rV   r   )chr)rX   cr   r   r   rZ   -  r[   z,Sniffer._guess_delimiter.<locals>.<listcomp>   
   r   ro   c                 S   s   | d S )Nro   r   )rY   r   r   r   <lambda>G  s    z*Sniffer._guess_delimiter.<locals>.<lambda>rr   c                 s   s    | ]}|d  V  qdS )ro   Nr   )rX   itemr   r   r   r_   L  s    z+Sniffer._guess_delimiter.<locals>.<genexpr>g      ?g?g{Gz?z%c )r   r   c                 S   s   g | ]\}}||fqS r   r   )rX   kvr   r   r   rZ   v  s    )listfiltersplitrangeminrG   r\   countr`   itemsrz   removesumfloatrh   sort)r   r}   rl   asciiZchunkLengthZ	iterationZcharFrequencyZmodesr   startendlinecharZmetaFrequencyZfreqr   ZmodeListtotalZconsistencyZ	thresholdr   r   rp   r-   rI   r   r   r   rj     s   


3
zSniffer._guess_delimiterc                 C   sj  t t|| |}t|}t|}i }t|D ]}d ||< qd}|D ]L}|dkr+ nE|d7 }t||kr6q#t| D ]2}	t}
z|
||	  W n t	t
fyY   t||	 }
Y nw |
||	 krn||	 d u rk|
||	< q<||	= q<q#d}| D ]:\}	}t|tdkrt||	 |kr|d7 }qv|d8 }qvz|||	  W n t	tfy   |d7 }Y qvw |d8 }qv|dkS )Nr      ro   )r   r   rm   rB   rG   r   r   r`   complexrQ   OverflowErrorr   typer#   )r   rk   ZrdrrT   columnsZcolumnTypesicheckedrH   colZthisTypeZ	hasHeaderZcolTyper   r   r   
has_header  sL   




zSniffer.has_headerr!   )r&   r'   r(   r    rm   ri   rj   r   r   r   r   r   r      s    
Lgr   )rs   Z_csvr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r"   ior   __all__r   r   r   r   r   r   	NameErrorr   r   r   r   r   r   <module>   s*   @


2