o w[e>@sdZddlZddlmZmZmZmZmZmZm Z m Z m Z m Z m Z mZmZmZddlmZddlmZgdZGdddZGd d d eZed eGd d d eZed eGdddeZedeGdddZGdddZzeWn eyeZYnwGdddZdS)z+ csv.py - read/write/investigate CSV files N)Error __version__writerreaderregister_dialectunregister_dialect get_dialect list_dialectsfield_size_limit QUOTE_MINIMAL QUOTE_ALLQUOTE_NONNUMERIC QUOTE_NONE__doc__)Dialect)StringIO)r r r rrrrexcel excel_tabr rrrrr Snifferrr DictReader DictWriter unix_dialectc@sDeZdZdZdZdZdZdZdZdZ dZ dZ dZ ddZ ddZdS) rzDescribe 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 _validateselfr/usr/lib/python3.10/csv.py__init__*s  zDialect.__init__c Cs4zt|WdSty}ztt|d}~wwN)_Dialect TypeErrorrstr)rerrrr/s  zDialect._validate)__name__ __module__ __qualname__r_namer delimiter quotechar escapechar doublequoteskipinitialspacelineterminatorquotingr 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 r0rrrrr6rc@seZdZdZdZdS)rzEDescribe the usual properties of Excel-generated TAB-delimited files. N)r&r'r(rr*rrrrr@srz excel-tabc@r1)rz:Describe the usual properties of Unix-generated CSV files.r2r3TF N) r&r'r(rr*r+r-r.r/r r0rrrrrEr5runixc@sDeZdZ  d ddZddZeddZejd dZd d ZdS) rNrcOs<||_||_||_t||g|Ri||_||_d|_dSNr) _fieldnamesrestkeyrestvalrdialectline_num)rf fieldnamesr;r<r=argskwdsrrrr Qs  zDictReader.__init__cCs|Sr!rrrrr__iter__ZszDictReader.__iter__cCs>|jdurzt|j|_Wn tyYnw|jj|_|jSr!)r:nextr StopIterationr>rrrrr@]s   zDictReader.fieldnamescCs ||_dSr!)r:)rvaluerrrr@gs cCs|jdkr|jt|j}|jj|_|gkrt|j}|gkstt|j|}t|j}t|}||kr?||d||j<|S||krR|j|dD]}|j||<qJ|Sr9) r>r@rDrdictziplenr;r<)rrowdlflrkeyrrr__next__ks"      zDictReader.__next__)NNNr) r&r'r(r rCpropertyr@setterrOrrrrrPs     rc@s:eZdZ  dddZddZdd Zd d Zd d ZdS)rrraisercOsH||_||_|dvrtd|||_t||g|Ri||_dS)N)rRignorez-extrasaction (%s) must be 'raise' or 'ignore')r@r<lower ValueError extrasactionr)rr?r@r<rVr=rArBrrrr s zDictWriter.__init__cCstt|j|j}||Sr!)rGrHr@writerow)rheaderrrr writeheaders zDictWriter.writeheadercsNjdkrj}|rtdddd|DfddjDS)NrRz(dict contains fields not in fieldnames: z, cSg|]}t|qSr)repr).0xrrr z,DictWriter._dict_to_list..c3s|] }|jVqdSr!)getr<)r\rNrowdictrrr sz+DictWriter._dict_to_list..)rVkeysr@rUjoin)rrb wrong_fieldsrrar _dict_to_lists zDictWriter._dict_to_listcCs|j||Sr!)rrWrg)rrbrrrrWszDictWriter.writerowcCs|jt|j|Sr!)r writerowsmaprg)rrowdictsrrrrhszDictWriter.writerowsN)rrRr)r&r'r(r rYrgrWrhrrrrrs   rc@s:eZdZdZddZd ddZddZd d Zd d ZdS)rze "Sniffs" the format of a CSV file (i.e. delimiter, quotechar) Returns a Dialect object. cCsgd|_dS)N)r2r6; :) preferredrrrrr szSniffer.__init__NcCsd|||\}}}}|s|||\}}|stdGdddt}||_||_|p+d|_||_|S)zI Returns a dialect (or None) corresponding to the sample zCould not determine delimiterc@seZdZdZdZeZdS)zSniffer.sniff..dialectsniffedr4N)r&r'r(r)r/r r0rrrrr=sr=r3)_guess_quote_and_delimiter_guess_delimiterrrr-r*r+r.)rsample delimitersr+r-r*r.r=rrrsniffs   z Sniffer.sniffc Csg}dD]}t|tjtjB}||}|rnq|sdSi}i}d}|j} |D]\} | dd} | | } | rA|| dd|| <z | dd} | | } Wn tyVYq)w| rk|dusa| |vrk|| dd|| <z| dd} Wn ty|Yq)w| | r|d7}q)t||jd } |rt||jd }|||k}|d krd }nd }d}td t || d tj}| |rd}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))rFNrrquotedelimNspacerNr7rz]((%(delim)s)|^)\W*%(quote)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\W*((%(delim)s)|$))rwruTF) recompileDOTALL MULTILINEfindall groupindexr`KeyErrormaxescapesearch)rdatarsmatchesrestrregexpquotesdelimsspacesrmnrNr+rwr. dq_regexpr-rrrrpsj          z"Sniffer._guess_quote_and_delimitercCsttd|d}ddtdD}tdt|}d}i}i}i}d|} } | t|kr-|d7}|| | D] } |D]} || i} | | }| |dd| |<| || <q. rrvcSs|dS)Nrvr)r]rrrGsz*Sniffer._guess_delimiter..rycss|]}|dVqdS)rvNr)r\itemrrrrcLsz+Sniffer._guess_delimiter..g?g?g{Gz?z%c )rrcSsg|]\}}||fqSrr)r\kvrrrr^vs)listfiltersplitrangeminrIr`countrditemsrremovesumfloatrnsort)rrrsascii chunkLength iteration charFrequencymodesrstartendlinechar metaFrequencyfreqrmodeListtotal consistency thresholdrrrwr.rKrrrrqs          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