B
    u9a4?                 @   sH  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 d dlmZ dddd	d
ddddddddddddddddg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ye W n ek
r4   eZY nX 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)OrderedDict)StringIOr   r   r   r   r   r   r   excel	excel_tabr
   r   r   r   r   r	   Snifferr   r   
DictReader
DictWriterunix_dialectc               @   s@   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.7/csv.py__init__+   s    
zDialect.__init__c          
   C   s@   yt |  W n. tk
r: } ztt|W d d }~X Y nX d S )N)_Dialect	TypeErrorr   str)r   er   r   r   r   0   s    zDialect._validate)__name__
__module____qualname___namer   	delimiter	quotecharZ
escapechardoublequoteskipinitialspacelineterminatorquotingr    r   r   r   r   r   r      s   c               @   s$   e Zd ZdZdZdZdZdZeZ	dS )r   ,"TFz
N)
r%   r&   r'   r)   r*   r+   r,   r-   r   r.   r   r   r   r   r   7   s   c               @   s   e Zd ZdZdS )r   	N)r%   r&   r'   r)   r   r   r   r   r   A   s   z	excel-tabc               @   s$   e Zd ZdZdZdZdZdZeZ	dS )r   r/   r0   TF
N)
r%   r&   r'   r)   r*   r+   r,   r-   r   r.   r   r   r   r   r   F   s   Zunixc               @   s@   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   s6   || _ || _|| _t||f||| _|| _d| _d S )Nr   )_fieldnamesrestkeyrestvalr   dialectline_num)r   f
fieldnamesr4   r5   r6   argskwdsr   r   r   r    R   s    zDictReader.__init__c             C   s   | S )Nr   )r   r   r   r   __iter__[   s    zDictReader.__iter__c             C   s@   | j d kr0yt| j| _ W n tk
r.   Y nX | jj| _| j S )N)r3   nextr   StopIterationr7   )r   r   r   r   r9   ^   s    

zDictReader.fieldnamesc             C   s
   || _ d S )N)r3   )r   valuer   r   r   r9   h   s    c             C   s   | j dkr| j t| j}| jj | _ x|g kr:t| j}q&W tt| j|}t| j}t|}||k rz||d  || j< n*||krx | j|d  D ]}| j||< qW |S )Nr   )	r7   r9   r=   r   r   ziplenr4   r5   )r   rowdZlfZlrkeyr   r   r   __next__l   s    




zDictReader.__next__)NNNr   )	r%   r&   r'   r    r<   propertyr9   setterrE   r   r   r   r   r   Q   s    

c               @   s6   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   sB   || _ || _| dkr$td| || _t||f||| _d S )N)rH   ignorez-extrasaction (%s) must be 'raise' or 'ignore')r9   r5   lower
ValueErrorextrasactionr   )r   r8   r9   r5   rL   r6   r:   r;   r   r   r   r       s    zDictWriter.__init__c             C   s    t t| j| j}| | d S )N)dictr@   r9   writerow)r   headerr   r   r   writeheader   s    zDictWriter.writeheaderc                sN   j dkr8  j }|r8tdddd |D   fddjD S )NrH   z(dict contains fields not in fieldnames: z, c             S   s   g | ]}t |qS r   )repr).0xr   r   r   
<listcomp>   s    z,DictWriter._dict_to_list.<locals>.<listcomp>c             3   s   | ]}  |jV  qd S )N)getr5   )rR   rD   )rowdictr   r   r   	<genexpr>   s    z+DictWriter._dict_to_list.<locals>.<genexpr>)rL   keysr9   rK   join)r   rV   Zwrong_fieldsr   )rV   r   r   _dict_to_list   s    
zDictWriter._dict_to_listc             C   s   | j | |S )N)r   rN   rZ   )r   rV   r   r   r   rN      s    zDictWriter.writerowc             C   s   | j t| j|S )N)r   	writerowsmaprZ   )r   Zrowdictsr   r   r   r[      s    zDictWriter.writerowsN)r   rH   r   )r%   r&   r'   r    rP   rZ   rN   r[   r   r   r   r   r      s    
	c               @   s6   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   dddddg| _ d S )Nr/   r1   ; :)	preferred)r   r   r   r   r       s    zSniffer.__init__Nc             C   sd   |  ||\}}}}|s(| ||\}}|s4tdG dd dt}||_||_|pVd|_||_|S )NzCould not determine delimiterc               @   s   e Zd ZdZdZeZdS )zSniffer.sniff.<locals>.dialectZsniffedz
N)r%   r&   r'   r(   r-   r   r.   r   r   r   r   r6      s   r6   r0   )_guess_quote_and_delimiter_guess_delimiterr   r   r+   r)   r*   r,   )r   sample
delimitersr*   r+   r)   r,   r6   r   r   r   sniff   s    

zSniffer.sniffc          	   C   s  g }x0dD ](}t |t jt jB }||}|r
P q
W |s>dS i }i }d}|j}	x|D ]}
|	d d }|
| }|r||dd ||< y|	d d }|
| }W n tk
r   wVY nX |r|d ks||kr||dd ||< y|	d d }W n tk
r   wVY nX |
| rV|d7 }qVW t||jd}|rZt||jd}|| |k}|d	krbd
}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   delimZspace)rD   r2   r   z]((%(delim)s)|^)\W*%(quote)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\W*((%(delim)s)|$))rh   rf   TF)recompileDOTALL	MULTILINEfindall
groupindexrU   KeyErrormaxescapesearch)r   datard   matchesZrestrZregexpZquotesdelimsZspacesrn   mnrD   r*   rh   r,   Z	dq_regexpr+   r   r   r   ra      sZ    



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| }	}
x|	t|k rj|d7 }xT||	|
 D ]D}x>|D ]6}||i }||}||dd ||< |||< qW qvW x| D ]}t || 	 }t|dkr|d d dkrqt|dkrZt
|dd	 d
||< |||  || d || d tdd |D  f||< q|d ||< qW |	 }tt|| t|}d}d}xt|dkr||krx\|D ]T\}}|d dkr|d dkr|d | |kr|d ks||kr|||< qW |d8 }qW t|dkr\t | d }|d ||d d| k}||fS |
}	|
|7 }
qRW |svdS t|dkrxF| jD ]<}|| kr|d ||d d| k}||fS qW dd |	 D }|  |d d }|d ||d d| k}||fS )Nr2   c             S   s   g | ]}t |qS r   )chr)rR   cr   r   r   rT   .  s    z,Sniffer._guess_delimiter.<locals>.<listcomp>   
   r   rg   c             S   s   | d S )Nrg   r   )rS   r   r   r   <lambda>H      z*Sniffer._guess_delimiter.<locals>.<lambda>)rD   c             s   s   | ]}|d  V  qdS )rg   Nr   )rR   itemr   r   r   rW   M  s    z+Sniffer._guess_delimiter.<locals>.<genexpr>g      ?g?g{Gz?z%c )r   r   c             S   s   g | ]\}}||fqS r   r   )rR   kvr   r   r   rT   w  s    )listfiltersplitrangeminrA   rU   countrX   itemsrp   removesumfloatr`   sort)r   rs   rd   asciiZchunkLengthZ	iterationZcharFrequencyZmodesru   startendlinecharZmetaFrequencyZfreqr   ZmodeListZtotalZconsistencyZ	thresholdr   r   rh   r,   rC   r   r   r   rb     st    


zSniffer._guess_delimiterc             C   s  t t|| |}t|}t|}i }xt|D ]}d ||< q2W d}x|D ]}|dkrZP |d7 }t||krpqLxt| D ]x}	xJtt	t
gD ]0}
y|
||	  P W q ttfk
r   Y qX qW t||	 }
|
||	 kr~||	 d kr|
||	< q~||	= q~W qLW d}x| D ]~\}	}t|tdkrLt||	 |krB|d7 }n|d8 }n<y|||	  W n" ttfk
r~   |d7 }Y n
X |d8 }qW |dkS )Nr      rg   )r   r   re   r=   rA   r   r   rX   intr   complexrK   OverflowErrorr   typer"   )r   rc   ZrdrrO   columnsZcolumnTypesicheckedrB   colZthisTypeZ	hasHeaderZcolTyper   r   r   
has_header  sJ    
 




zSniffer.has_header)N)r%   r&   r'   r    re   ra   rb   r   r   r   r   r   r      s
   
Lg) ri   Z_csvr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r!   collectionsr   ior   __all__r   r   r   r   r   r   	NameErrorr   r   r   r   r   r   <module>   s0   @



2
