o 0¦iž>ã@sdZddlZddlmZmZmZmZmZmZm Z m Z m Z m Z m Z mZmZmZddlmZddlmZgd¢ZGdd„dƒZGd d „d eƒZed eƒGd d „d eƒZed eƒGdd„deƒZedeƒGdd„dƒZGdd„dƒZzeWn ey�eZYnwGdd„dƒZdS)z+ csv.py - read/write/investigate CSV files é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 rrrrÚexcelÚ excel_tabr rrrrr ÚSnifferrrÚ DictReaderÚ DictWriterÚ unix_dialectc@sDeZdZdZdZdZdZdZdZdZ dZ dZ dZ dd„Z dd„ZdS) rzÄDescribe a CSV dialect. This must be subclassed (see csv.excel). Valid attributes are: delimiter, quotechar, escapechar, doublequote, skipinitialspace, lineterminator, quoting. ÚFNcCs|jtkrd|_| ¡dS)NT)Ú __class__rÚ_validÚ _validate©Úself©rú*/opt/alt/python310/lib64/python3.10/csv.pyÚ__init__*s  zDialect.__init__c Cs4zt|ƒWdSty}ztt|ƒƒ‚d}~ww©N)Ú_DialectÚ TypeErrorrÚstr)rÚerrrr/s  €þzDialect._validate)Ú__name__Ú __module__Ú __qualname__rÚ_namerÚ delimiterÚ quotecharZ escapecharÚ doublequoteÚskipinitialspaceÚlineterminatorÚquotingr rrrrrrs rc@ó(eZdZdZdZdZdZdZdZe Z dS)rz;Describe the usual properties of Excel-generated CSV files.ú,ú"TFú N) r&r'r(rr*r+r,r-r.r r/rrrrr6órc@seZdZdZdZdS)rzEDescribe the usual properties of Excel-generated TAB-delimited files.ú N)r&r'r(rr*rrrrr@srz excel-tabc@r0)rz:Describe the usual properties of Unix-generated CSV files.r1r2TFÚ N) r&r'r(rr*r+r,r-r.r r/rrrrrEr4rZunixc@sDeZdZ  d dd„Zdd„Zedd„ƒZejd d„ƒZd d „ZdS) rNrcOs<||_||_||_t||g|¢Ri|¤Ž|_||_d|_dS©Nr)Ú _fieldnamesÚrestkeyÚrestvalrÚdialectÚline_num)rÚfÚ fieldnamesr9r:r;ÚargsÚkwdsrrrr Qs  zDictReader.__init__cCs|Sr!rrrrrÚ__iter__ZszDictReader.__iter__cCs>|jdurzt|jƒ|_Wn tyYnw|jj|_|jSr!)r8ÚnextrÚ StopIterationr<rrrrr>]s  ÿ zDictReader.fieldnamescCs ||_dSr!)r8)rÚvaluerrrr>gs cCs¨|jdkr|jt|jƒ}|jj|_|gkrt|jƒ}|gkstt|j|ƒƒ}t|jƒ}t|ƒ}||kr?||d…||j<|S||krR|j|d…D]}|j||<qJ|Sr7) r<r>rBrÚdictÚzipÚlenr9r:)rÚrowÚdZlfZlrÚkeyrrrÚ__next__ks"    ÿ ý zDictReader.__next__)NNNr) r&r'r(r rAÚpropertyr>ÚsetterrKrrrrrPs ÿ    rc@s:eZdZ  ddd„Zdd„Zdd „Zd d „Zd d „ZdS)rrÚraisercOsH||_||_| ¡dvrtd|ƒ‚||_t||g|¢Ri|¤Ž|_dS)N)rNÚignorez-extrasaction (%s) must be 'raise' or 'ignore')r>r:ÚlowerÚ ValueErrorÚ extrasactionr)rr=r>r:rRr;r?r@rrrr ƒs ÿzDictWriter.__init__cCstt|j|jƒƒ}| |¡Sr!)rErFr>Úwriterow)rÚheaderrrrÚ writeheader�s zDictWriter.writeheadercsNˆjdkrˆ ¡ˆj}|rtdd dd„|Dƒ¡ƒ‚‡‡fdd„ˆjDƒS)NrNz(dict contains fields not in fieldnames: z, cSóg|]}t|ƒ‘qSr)Úrepr)Ú.0ÚxrrrÚ –óz,DictWriter._dict_to_list..c3s�|] }ˆ |ˆj¡VqdSr!)Úgetr:)rXrJ©ÚrowdictrrrÚ —s€z+DictWriter._dict_to_list..)rRÚkeysr>rQÚjoin)rr^Z wrong_fieldsrr]rÚ _dict_to_list‘s ÿzDictWriter._dict_to_listcCs|j | |¡¡Sr!)rrSrb)rr^rrrrS™szDictWriter.writerowcCs|j t|j|ƒ¡Sr!)rÚ writerowsÚmaprb)rZrowdictsrrrrcœszDictWriter.writerowsN)rrNr)r&r'r(r rUrbrSrcrrrrr‚s ÿ  rc@s:eZdZdZdd„Zd dd„Zdd„Zd d „Zd d „ZdS)rze "Sniffs" the format of a CSV file (i.e. delimiter, quotechar) Returns a Dialect object. cCsgd¢|_dS)N)r1r5ú;ú ú:)Ú preferredrrrrr ªszSniffer.__init__NcCsd| ||¡\}}}}|s| ||¡\}}|stdƒ‚Gdd„dtƒ}||_||_|p+d|_||_|S)zI Returns a dialect (or None) corresponding to the sample zCould not determine delimiterc@seZdZdZdZeZdS)zSniffer.sniff..dialectZsniffedr3N)r&r'r(r)r.r r/rrrrr;½sr;r2)Ú_guess_quote_and_delimiterÚ_guess_delimiterrrr,r*r+r-)rÚsampleÚ delimitersr+r,r*r-r;rrrÚsniff¯s  ÿÿ z Sniffer.sniffc CsŒg}dD]}t |tjtjB¡}| |¡}|rnq|sdSi}i}d}|j} |D]\} | dd} | | } | rA| | d¡d|| <z | dd} | | } Wn tyVYq)w| rk|dusa| |vrk| | d¡d|| <z| dd} Wn ty|Yq)w| | r…|d7}q)t||jd �} |r£t||jd �}|||k}|d kr¢d }nd }d}t d t  |¡| d œtj¡}|  |¡r¾d}nd}| |||fS)a� Looks for text enclosed between two identical quotes (the probable quotechar) which are preceded and followed by the same character (the probable delimiter). For example: ,'some text', The quote with the most wins, same with the delimiter. If there is no quotechar the delimiter can't be determined this way. )zI(?P[^\w\n"\'])(?P ?)(?P["\']).*?(?P=quote)(?P=delim)zG(?:^|\n)(?P["\']).*?(?P=quote)(?P[^\w\n"\'])(?P ?)zG(?P[^\w\n"\'])(?P ?)(?P["\']).*?(?P=quote)(?:$|\n)z-(?:^|\n)(?P["\']).*?(?P=quote)(?:$|\n))rFNrrÚquoteéÚdelimNZspace©rJr6rz]((%(delim)s)|^)\W*%(quote)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\W*((%(delim)s)|$))rprnTF) ÚreÚcompileÚDOTALLÚ MULTILINEÚfindallÚ groupindexr\ÚKeyErrorÚmaxÚescapeÚsearch)rÚdatarlZmatchesZrestrZregexpZquotesÚdelimsÚspacesrwÚmÚnrJr+rpr-Z dq_regexpr,rrrriÌsj  ÿ    ÿ ÿ€ €ÿþ  z"Sniffer._guess_quote_and_delimitercCsttd| d¡ƒƒ}dd„tdƒDƒ}tdt|ƒƒ}d}i}i}i}d|} } | t|ƒk�r-|d7}|| | …D] } |D]} | | i¡} |  | ¡}|  |d¡d| |<| || <q.éé rrocSs|dS)Nror)rYrrrÚGsz*Sniffer._guess_delimiter..rqcss�|]}|dVqdS)roNr)rXÚitemrrrr_Ls€z+Sniffer._guess_delimiter..gð?gÍÌÌÌÌÌì?g{®Gáz„?z%c )rrcSsg|]\}}||f‘qSrr)rXÚkÚvrrrrZvséÿÿÿÿ)ÚlistÚfilterÚsplitÚrangeÚminrGr\Úcountr`ÚitemsryÚremoveÚsumÚfloatrhÚsort)rr|rlÚasciiZ chunkLengthZ iterationZ charFrequencyZmodesr}ÚstartÚendÚlineÚcharZ metaFrequencyZfreqr�ZmodeListÚtotalZ consistencyZ thresholdr‡rˆrpr-rIrrrrjs†    ú   ÿ €ú ÿ Ï3  ÿ ý  ÿzSniffer._guess_delimiterc Csjtt|ƒ| |¡ƒ}t|ƒ}t|ƒ}i}t|ƒD]}d||<qd}|D]L}|dkr+nE|d7}t|ƒ|kr6q#t| ¡ƒD]2} t} z| || ƒWnt t fyYt|| ƒ} Ynw| || krn|| durk| || <q<|| =qs*@     2 ÿ