a `?@sdZddlZddlmZmZmZmZmZmZm Z m Z m Z m Z m Z mZmZmZddlmZddlmZgdZGdddZGd d d eZed eGd d d eZed eGdddeZedeGdddZGdddZzeWneyeZYn0GdddZdS)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/local/src/Python-3.9.6/Lib/csv.py__init__*s zDialect.__init__c CsBz t|Wn0ty<}ztt|WYd}~n d}~00dSN)_Dialect TypeErrorrstr)rerrrr/s zDialect._validate)__name__ __module__ __qualname__r_namer delimiter quotecharZ escapechar doublequoteskipinitialspacelineterminatorquotingr rrrrrrsrc@s(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/rrrrr6src@seZdZdZdZdS)rzEDescribe the usual properties of Excel-generated TAB-delimited files. N)r&r'r(rr*rrrrr@srz excel-tabc@s(eZdZdZdZdZdZdZdZe Z dS)rz:Describe the usual properties of Unix-generated CSV files.r0r1TF N) r&r'r(rr*r+r,r-r.r r/rrrrrEsrunixc@s@eZdZd ddZddZeddZejd dZd d ZdS) rNrcOs<||_||_||_t||g|Ri||_||_d|_dSNr) _fieldnamesrestkeyrestvalrdialectline_num)rf fieldnamesr8r9r:argskwdsrrrr Qs zDictReader.__init__cCs|Sr!rrrrr__iter__ZszDictReader.__iter__cCs>|jdur.zt|j|_Wnty,Yn0|jj|_|jSr!)r7nextr StopIterationr;rrrrr=]s   zDictReader.fieldnamescCs ||_dSr!)r7)rvaluerrrr=gscCs|jdkr|jt|j}|jj|_|gkr8t|j}q$tt|j|}t|j}t|}||krv||d||j<n&||kr|j|dD]}|j||<q|Sr6) r;r=rArdictziplenr8r9)rrowdZlfZlrkeyrrr__next__ks      zDictReader.__next__)NNNr) r&r'r(r r@propertyr=setterrJrrrrrPs   rc@s6eZdZdddZddZdd Zd d Zd d ZdS)rrraisercOsH||_||_|dvr$td|||_t||g|Ri||_dS)N)rMignorez-extrasaction (%s) must be 'raise' or 'ignore')r=r9lower ValueError extrasactionr)rr<r=r9rQr:r>r?rrrr s zDictWriter.__init__cCstt|j|j}||Sr!)rDrEr=writerow)rheaderrrr writeheaderszDictWriter.writeheadercsNjdkr8j}|r8tdddd|DfddjDS)NrMz(dict contains fields not in fieldnames: z, cSsg|] }t|qSr)repr).0xrrr z,DictWriter._dict_to_list..c3s|]}|jVqdSr!)getr9)rVrIrowdictrrr rYz+DictWriter._dict_to_list..)rQkeysr=rPjoin)rr\Z wrong_fieldsrr[r _dict_to_lists zDictWriter._dict_to_listcCs|j||Sr!)rrRr`)rr\rrrrRszDictWriter.writerowcCs|jt|j|Sr!)r writerowsmapr`)rZrowdictsrrrraszDictWriter.writerowsN)rrMr)r&r'r(r rTr`rRrarrrrrs 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)r0r3; :) preferredrrrrr szSniffer.__init__NcCsd|||\}}}}|s(|||\}}|s4tdGdddt}||_||_|pVd|_||_|S)zI Returns a dialect (or None) corresponding to the sample zCould not determine delimiterc@seZdZdZdZeZdS)zSniffer.sniff..dialectZsniffedr2N)r&r'r(r)r.r r/rrrrr:sr:r1)_guess_quote_and_delimiter_guess_delimiterrrr,r*r+r-)rsample delimitersr+r,r*r-r:rrrsniffs  z Sniffer.sniffc Csg}dD]*}t|tjtjB}||}|rq4q|s[^\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))rFNrrquotedelimNspacerIr4rz]((%(delim)s)|^)\W*%(quote)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\W*((%(delim)s)|$))rnrlTF) recompileDOTALL MULTILINEfindall groupindexrZKeyErrormaxescapesearch)rdatarjmatchesZrestrZregexpquotesdelimsspacesrvmnrIr+rnr-Z dq_regexpr,rrrrgs`            z"Sniffer._guess_quote_and_delimitercCsttd|d}ddtdD}tdt|}d}i}i}i}d|} } | t|krR|d7}|| | D]@} |D]6} || i} | | }| |dd| |<| || <qxqp|D]} t||  }t|dkr|dddkrqt|dkrLt |d d d || <| || || d|| dt d d |Df|| <q|d|| <q| }t t||t|}d}d}t|dkr||kr|D]T\}}|ddkr|ddkr|d||kr|dus||vr|||<q|d8}qt|dkrDt|d}|d||dd|k}||fS| } | |7} qN|s\dSt|dkr|jD]@}||vrp|d||dd|k}||fSqpdd| D}||dd}|d||dd|k}||fS)a The delimiter /should/ occur the same number of times on each row. However, due to malformed data, it may not. We don't want an all or nothing approach, so we allow for small variations in this number. 1) build a table of the frequency of each character on every line. 2) build a table of frequencies of this frequency (meta-frequency?), e.g. 'x occurred 5 times in 10 rows, 6 times in 1000 rows, 7 times in 2 rows' 3) use the mode of the meta-frequency to determine the /expected/ frequency for that character 4) find out how often the character actually meets that goal 5) the character that best meets its goal is the delimiter For performance reasons, the data is evaluated in chunks, so it can try and evaluate the smallest portion of the data possible, evaluating additional chunks as necessary. Nr4cSsg|] }t|qSr)chr)rVcrrrrX-rYz,Sniffer._guess_delimiter.. rrmcSs|dS)Nrmr)rWrrrGrYz*Sniffer._guess_delimiter..rpcss|]}|dVqdS)rmNr)rVitemrrrr]LrYz+Sniffer._guess_delimiter..g?g?g{Gz?z%c )rrcSsg|]\}}||fqSrr)rVkvrrrrXvrY)listfiltersplitrangeminrFrZcountr^itemsrxremovesumfloatrfsort)rr{rjasciiZ chunkLengthZ iterationZ charFrequencymodesr~startendlinecharZ metaFrequencyfreqrZmodeListtotalZ consistency thresholdrrrnr-rHrrrrhs               zSniffer._guess_delimiterc Cstt|||}t|}t|}i}t|D] }d||<q0d}|D]}|dkrVq|d7}t||krlqFt|D]v} tt t fD]2} z| || WqWqt t fyYq0qt|| } | || krx|| dur| || <qx|| =qxqFd} | D]z\} } t| tdkr>t|| | kr4| d7} n| d8} qz| || Wn t tfyn| d7} Yq0| d8} q| dkS)Nrrm)rrrkrArFrrr^intrcomplexrP OverflowErrorrtyper#) rriZrdrrScolumnsZ columnTypesicheckedrGcolZthisTypeZ hasHeaderZcolTyperrr has_headersH            zSniffer.has_header)N) r&r'r(rr rkrgrhrrrrrrs  Lgr)rrqZ_csvrrrrrrrr r r r r rrr"ior__all__rrrrrr NameErrorrrrrrrs&@     2