o ?Og>@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*/opt/alt/python310/lib64/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 quotecharZ 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 r/rrrrr6rc@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 ddZddZeddZejd dZd d ZdS) rNrcOs<||_||_||_t||g|Ri||_||_d|_dSNr) _fieldnamesrestkeyrestvalrdialectline_num)rf fieldnamesr9r:r;argskwdsrrrr Qs  zDictReader.__init__cCs|Sr!rrrrr__iter__ZszDictReader.__iter__cCs>|jdurzt|j|_Wn tyYnw|jj|_|jSr!)r8nextr StopIterationr<rrrrr>]s   zDictReader.fieldnamescCs ||_dSr!)r8)rvaluerrrr>gs cCs|jdkr|jt|j}|jj|_|gkrt|j}|gkstt|j|}t|j}t|}||kr?||d||j<|S||krR|j|dD]}|j||<qJ|Sr7) r<r>rBrdictziplenr9r:)rrowdZlfZlrkeyrrr__next__ks"      zDictReader.__next__)NNNr) r&r'r(r rApropertyr>setterrKrrrrrPs     rc@s:eZdZ  dddZddZdd Zd d Zd d ZdS)rrraisercOsH||_||_|dvrtd|||_t||g|Ri||_dS)N)rNignorez-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)rheaderrrr writeheaders zDictWriter.writeheadercsNjdkrj}|rtdddd|DfddjDS)NrNz(dict contains fields not in fieldnames: z, cSg|]}t|qSr)repr).0xrrr z,DictWriter._dict_to_list..c3s|] }|jVqdSr!)getr:)rXrJrowdictrrr sz+DictWriter._dict_to_list..)rRkeysr>rQjoin)rr^Z wrong_fieldsrr]r _dict_to_lists zDictWriter._dict_to_listcCs|j||Sr!)rrSrb)rr^rrrrSszDictWriter.writerowcCs|jt|j|Sr!)r writerowsmaprb)rZrowdictsrrrrcszDictWriter.writerowsN)rrNr)r&r'r(r rUrbrSrcrrrrrs   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)r1r5; :) 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..dialectZsniffedr3N)r&r'r(r)r.r r/rrrrr;sr;r2)_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))rFNrrquotedelimNZspacerJr6rz]((%(delim)s)|^)\W*%(quote)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\W*((%(delim)s)|$))rprnTF) recompileDOTALL MULTILINEfindall groupindexr\KeyErrormaxescapesearch)rdatarlZmatchesZrestrZregexpZquotesdelimsspacesrwmnrJr+rpr-Z dq_regexpr,rrrrisj          z"Sniffer._guess_quote_and_delimitercCsttd|d}ddtdD}tdt|}d}i}i}i}d|} } | t|kr-|d7}|| | D] } |D]} || i} | | }| |dd| |<| || <q. rrocSs|dS)Nror)rYrrrGsz*Sniffer._guess_delimiter..rqcss|]}|dVqdS)roNr)rXitemrrrr_Lsz+Sniffer._guess_delimiter..g?g?g{Gz?z%c )rrcSsg|]\}}||fqSrr)rXkvrrrrZvs)listfiltersplitrangeminrGr\countr`itemsryremovesumfloatrhsort)rr|rlasciiZ chunkLengthZ iterationZ charFrequencyZmodesr}startendlinecharZ metaFrequencyZfreqrZmodeListtotalZ consistencyZ thresholdrrrpr-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