ó
    %ÑLjÍD  ã                   ó@  • S r SSKrSSKrSSKrSSKrSSKJrJrJrJ	r	  SSK
r
SSKrSSKrSSKrSSKrSSKJrJr  SSKJr  SSKJr  / SQr\\\
R0                  4   r\\\\\   4   r\R6                  \\\\\   4   4   rS	\S
\4S jr " S S5      r " S S5      r  " S S\ 5      r! " S S\ 5      r" " S S\"5      r#   S#S\S\\$   S\\$   S	\\   S
\4
S jjr%\%r&S\S\	\'\\   /\S\\   4   4   4S jr(S\S\\   4S jr)S\S\	\*/\$4   S
\'4S  jr+ " S! S"5      r,g)$aè  Support for reading delimiter-separated value files.

This module contains unicode aware replacements for :func:`csv.reader`
and :func:`csv.writer`. It was stolen/extracted from the ``csvkit``
project to allow re-use when the whole ``csvkit`` package isn't
required.

The original implementations were largely copied from
`examples in the csv module documentation <http://docs.python.org/library/csv.html#examples>`_.

.. seealso:: http://en.wikipedia.org/wiki/Delimiter-separated_values
é    N)ÚOptionalÚUnionÚIOÚCallable)ÚIterableÚ	Generatoré   )Úutils)ÚDialect)	ÚUnicodeWriterÚUnicodeReaderÚUnicodeReaderWithLineNumberÚUnicodeDictReaderÚNamedTupleReaderÚiterrowsÚrewriteÚadd_rowsÚfilter_rows_as_dictÚencodingÚreturnc                 óB   • [         R                  " U 5      R                  $ )z#Normalize the name of the encoding.)ÚcodecsÚlookupÚname)r   s    Ú–C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\csvw/dsv.pyÚnormalize_encodingr   *   s   € ä�=Š=˜Ó"×'Ñ'Ð'ó    c                   ó¦   • \ rS rSrSr  SS\\   S\\\\	4      4S jjr
S rS\\   4S	 jrS
 rS\\\	S4      4S jrS\\\\\4      4S jrSrg)r   é/   u”  
Write Unicode data to a csv file.

:param f: The target to which to write the data; a local path specified as `str` or     `pathlib.Path` or `None`, in which case the data, formatted as DSV can be retrieved     via :meth:`~UnicodeWriter.read`
:param dialect: Either a dialect name as recognized by `csv.writer` or a     :class:`~Dialect` instance for dialect customization beyond what can be done with     `csv.writer`.
:param kw: Keyword arguments passed through to `csv.writer`.

.. code-block:: python

    >>> from csvw import UnicodeWriter
    >>> with UnicodeWriter('data.tsv', delimiter='  ') as writer:
    ...     writer.writerow(['Ã¤', 'Ã¶', 'Ã¼'])
NÚfÚdialectc                 ó–  • Xl         UR                  SS5      U l        [        U[        5      (       aB  UR
                  U l        UR                  5       U l        U R                  R                  U5        OX0l        U(       a  X R                  S'   [        U R                  5      U l        U R                  R                  S5      U l        U R                  (       aQ  U R                  R                  S5      [        R                  :w  a$  [        U R                  SU R                  -  4S jnOS nX@l        S	U l        S
U l        S U l        g )Nr   úutf-8r!   Ú
escapecharÚquotingé   c                 ót   • U  Vs/ s H&  n[        XA5      (       a  UR                  X#5      OUPM(     sn$ s  snf ©N)Ú
isinstanceÚreplace)ÚrowÚ_typeÚ_oldÚ_newÚss        r   Ú_escapedoubledÚ.UnicodeWriter.__init__.<locals>._escapedoubledV   s9   € ñ WZÓZÒVYÐQR´¸A×1EÑ1E˜Ÿ	™	 $Ô-È1ÒLÑVYÑZÐZùÒZs   …-5c                 ó   • U $ r(   © )r+   s    r   r0   r1   \   s   € Ø�
r   Fr   )r    Úpopr   r)   r   Úpython_encodingÚas_python_formatting_parametersÚkwÚupdater   Úgetr$   ÚcsvÚ
QUOTE_NONEÚstrr0   Ú_closeÚ_rows_writtenÚwriter)Úselfr    r!   r7   r0   s        r   Ú__init__ÚUnicodeWriter.__init__B   së   € ð
 ŒØŸ™˜z¨7Ó3ˆŒÜ�gœw×'Ñ'Ø#×3Ñ3ˆDŒMØ×=Ñ=Ó?ˆDŒGØ�G‰G�N‰N˜2ÕàŒGÞØ%,—‘˜	Ñ"Ü*¨4¯=©=Ó9ˆŒØŸ'™'Ÿ+™+ lÓ3ˆŒØ�?�?˜tŸw™wŸ{™{¨9Ó5¼¿¹ÓGô &)Ø$(§O¡OØ$%¨¯©Ñ$7õ[òà,ÔØˆŒØˆÔØˆ�r   c                 ó  • [        U R                  [        [        R                  45      (       a{  [        U R                  [        R                  5      (       a  [        U R                  5      U l        [
        R                  " U R                  SU R                  SS9U l        SU l        O&U R                  c  [
        R                  " SS9U l        [        R                  " U R                  40 U R                  D6U l        U $ )NÚwtÚ )r   ÚnewlineT)rF   )r)   r    r<   ÚpathlibÚPathÚioÚopenr   r=   ÚStringIOr:   r?   r7   ©r@   s    r   Ú	__enter__ÚUnicodeWriter.__enter__c   s    € Ü�d—f‘fœs¤G§L¡LÐ1×2Ñ2Ü˜$Ÿ&™&¤'§,¡,×/Ñ/Ü˜TŸV™V›�”ä—W’W˜TŸV™V T°D·M±MÈ2ÑNˆDŒFØˆD�KØ�V‰V‰^Ü—[’[¨Ñ,ˆDŒFä—j’j §¡Ñ3¨4¯7©7Ñ3ˆŒØˆr   r   c                 óø   • [        U R                  S5      (       a  U R                  R                  S5        [        U R                  S5      (       a)  U R                  R                  5       R	                  S5      $ g)z|
If the writer has been initialized passing `None` as target, the CSV data as `bytes` can be
retrieved calling this method.
Úseekr   Úreadr#   N)Úhasattrr    rP   rQ   ÚencoderL   s    r   rQ   ÚUnicodeWriter.readp   sS   € ô
 �4—6‘6˜6×"Ñ"Ø�F‰F�K‰K˜ŒNÜ�4—6‘6˜6×"Ñ"Ø—6‘6—;‘;“=×'Ñ'¨Ó0Ð0Ør   c                 ó\   • U R                   (       a  U R                  R                  5         g g r(   ©r=   r    Úclose)r@   Útype_ÚvalueÚ	tracebacks       r   Ú__exit__ÚUnicodeWriter.__exit__{   ó   € Ø�;�;Ø�F‰F�L‰L�Nð r   r+   c                 ó‚   • U R                   R                  U R                  U5      5        U =R                  S-  sl        g)zWrite multiple rows.r	   N)r?   Úwriterowr0   r>   )r@   r+   s     r   r_   ÚUnicodeWriter.writerow   s0   € à�‰×Ñ˜T×0Ñ0°Ó5Ô6Ø×Ò˜aÑÖr   Úrowsc                 ó  • [        U5       Hq  u  p#[        U[        5      (       aF  US:X  a0  U R                  (       d  U R	                  UR                  5       5        UR                  5       nU R	                  U5        Ms     g)a  
Writes each row in `rows` formatted as CSV row. This behaves as
[`csvwriter.writerows`](https://docs.python.org/3/library/csv.html#csv.csvwriter.writerows)
except when an iterable of `dict` objects is passed. In that case, it is assumed that all
items in `rows` are `dict`s and all have the same keys in the same order (as what would
be read by `UnicodeDictReader`). Then, the keys of the first item are written as header row
and the values of each row are written as subsequent rows.

:param rows: The data to be written.
r   N)Ú	enumerater)   Údictr>   r_   ÚkeysÚvalues)r@   ra   Úir+   s       r   Ú	writerowsÚUnicodeWriter.writerows„   sY   € ô   –o‰FˆAÜ˜#œt×$Ñ$Ø˜“6 $×"4×"4à—M‘M #§(¡(£*Ô-Ø—j‘j“l�Ø�M‰M˜#Öò &r   )r=   r0   r>   r   r$   r    r7   r?   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚPathTyper   r   r<   rA   rM   ÚbytesrQ   r[   r   r_   ÚtupleÚlistrd   rh   Ú__static_attributes__r3   r   r   r   r   /   s‹   † ñð( %)Ø59ñà˜Ñ!ðð ˜e G¨S LÑ1Ñ2õòBð	�h˜u‘oô 	òð ˜H U¨3°¨9Ñ%5Ñ6ô  ð
˜h u¨U°D¸$Ð->Ñ'?Ñ@÷ r   r   c                   ó^   • \ rS rSrSr SS\S\\\\	4      4S jjr
S rS rS	 rS
 rS rSrg)r   é˜   aà  
Read Unicode data from a csv file.

:param f: The source from which to read the data; a local path specified as `str` or     `pathlib.Path`, a file-like object or a `list` of lines.
:param dialect: Either a dialect name as recognized by `csv.reader` or a     :class:`~Dialect` instance for dialect customization beyond what can be done with     `csv.writer`.
:param kw: Keyword arguments passed through to `csv.reader`.

.. code-block:: python

    >>> with UnicodeReader('tests/fixtures/frictionless-data.csv', delimiter='|') as reader:
    ...     for row in reader:
    ...         print(row)
    ...         break
    ...
    ['FK', 'Year', 'Location name', 'Value', 'binary', 'anyURI', 'email', 'boolean', 'array',
    'geojson']
Nr    r!   c                 ó2  • Xl         [        UR                  SS5      5      U l        UR                  SS 5      U l        [        U[        5      (       a  UOS U l        S U l        S U l	        U R                  (       aL  U R                  R                  U l        UR                  5       U l        U R                  R                  U5        OX0l        U(       a  X R                  S'   SU l        / U l        U R                  S:X  a  SU l        U R                  U l        g )Nr   z	utf-8-sigÚlineterminatorr!   Fr#   )r    r   r4   r   rF   r)   r   r!   ÚlinenoÚreaderr5   r6   r7   r8   r=   ÚcommentsÚ_reader_encoding)r@   r    r!   r7   s       r   rA   ÚUnicodeReader.__init__­   sÓ   € ð
 ŒÜ*¨2¯6©6°*¸kÓ+JÓKˆŒØ—v‘vÐ.°Ó5ˆŒÜ",¨W´g×">Ñ">‘wÀDˆŒØˆŒØˆŒØ�<�<Ø ŸL™L×8Ñ8ˆDŒMØ×=Ñ=Ó?ˆDŒGØ�G‰G�N‰N˜2ÕàŒGÞØ%,—‘˜	Ñ"ØˆŒØˆŒð �=‰=˜GÓ#Ø'ˆDŒMð
 !%§¡ˆÕr   c                 óÜ  • [        U R                  [        [        R                  45      (       aŽ  [        U R                  [        R                  5      (       a  [        U R                  5      U l        [
        R                  " U R                  SU R                  U R                  =(       d    SS9U l        SU l	        Ow[        U R                  S5      (       d\  / nU R                   HD  nUR                  [        U[        5      (       a  UR                  U R                  5      OU5        MF     Xl        [        R                  " U R                  40 U R                   D6U l        SU l        U $ )NÚrtrE   )Úmoder   rF   TrQ   éÿÿÿÿ)r)   r    r<   rG   rH   rI   rJ   r   rF   r=   rR   Úappendrp   Údecoder:   ry   r7   rx   )r@   ÚlinesÚlines      r   rM   ÚUnicodeReader.__enter__Ï   sì   € Ü�d—f‘fœs¤G§L¡LÐ1×2Ñ2Ü˜$Ÿ&™&¤'§,¡,×/Ñ/Ü˜TŸV™V›�”ä—W’W˜TŸV™V¨$¸¿¹ÐPT×P\ÑP\×PbÐ`bÑcˆDŒFØˆD�KÜ˜Ÿ™ ×(Ñ(ØˆEØŸœ�Ø—‘¼:ÀdÌE×;RÑ;R˜TŸ[™[¨¯©Ô7ÐX\Ö]ñ àŒFÜ—j’j §¡Ñ3¨4¯7©7Ñ3ˆŒØˆŒØˆr   c                 ó.  • U =R                   S-  sl         [        U R                  5       Vs/ s H5  n[        U[        5      (       a  UOUR                  U R                  5      PM7     nnU =R                   [        S U 5       5      -  sl         U$ s  snf )Nr	   c              3   óV   #   • U  H  n[        U5      R                  S 5      v •  M!     g7f)Ú
N)rr   Úcount)Ú.0r/   s     r   Ú	<genexpr>Ú*UnicodeReader._next_row.<locals>.<genexpr>ä   s    é € Ð<º°1œ4 ›7Ÿ=™=¨×.Ð.ºùs   ‚'))rx   Únextry   r)   r<   r‚   r{   Úsum)r@   r/   r+   s      r   Ú	_next_rowÚUnicodeReader._next_rowß   s€   € Ø�Š�qÑ�ô ˜$Ÿ+™+Ô&ó(â&�ô ˜Aœs×#Ñ#‰A¨¯©°$×2GÑ2GÓ)HÒHÙ&ð 	ð (ð 	�Š”sÑ<¹Ó<Ó<Ñ<�Øˆ
ùò	(s   ­<Bc                 óŠ  • U R                  5       nU R                  (       Ga›  U(       aH  U R                  R                  (       a-  US   R                  U R                  R                  5      (       dW  U(       a  [	        U5      S1:X  a  U R                  R
                  (       d%  U R                  U R                  R                  :  Ga³  U(       aH  U R                  R                  (       a-  US   R                  U R                  R                  5      (       d+  U(       aŸ  U R                  U R                  R                  :  a{  U R                  R                  U R                  U R                  R                  R                  U5      R                  U R                  R                  5      R                  5       45        U R                  5       nU(       aK  U R                  R                  (       a0  US   R                  U R                  R                  5      (       a  GMW  U(       a  [	        U5      S1:X  a  U R                  R
                  (       a  GMŒ  U R                  U R                  R                  :  a  GM³  U Vs/ s H  o R                  R                  U5      PM     snU R                  R                  S  nU$ s  snf )Nr   rE   )r�   r!   ÚcommentPrefixÚ
startswithÚsetÚskipBlankRowsrx   ÚskipRowsrz   r�   Ú	delimiterÚjoinÚlstripÚstripÚtrimmerÚskipColumns)r@   r+   r/   s      r   Ú__next__ÚUnicodeReader.__next__ç   sÃ  € Ø�n‰nÓˆØ�<�<ˆ<Þ˜4Ÿ<™<×5×5Ø�q‘6×$Ñ$ T§\¡\×%?Ñ%?×@Ñ@Þ¤ S£¨b¨TÓ!1°t·|±|×7Q×7QØ—[‘[ 4§<¡<×#8Ñ#8Ô8Þ˜DŸL™L×6×6Ø˜A™×)Ñ)¨$¯,©,×*DÑ*D×EÑEÞ §¡¨t¯|©|×/DÑ/DÓ!DØ—M‘M×(Ñ(ØŸ™ØŸ™×.Ñ.×3Ñ3°CÓ8×?Ñ?ÀÇÁ×@ZÑ@ZÓ[×aÑaÓcð*ô ð —n‘nÓ&�ö ˜4Ÿ<™<×5×5Ø�q‘6×$Ñ$ T§\¡\×%?Ñ%?×@Ô@Þ¤ S£¨b¨TÓ!1°t·|±|×7Q×7QÒ7QØ—[‘[ 4§<¡<×#8Ñ#8Ö8ñ 58Ó8²C¨q—<‘<×'Ñ'¨Ö*±CÑ8¸¿¹×9QÑ9QÐ9RÐSˆCØˆ
ùò 9s   Ê $K c                 ó\   • U R                   (       a  U R                  R                  5         g g r(   rV   )r@   Úexc_typeÚexc_valÚexc_tbs       r   r[   ÚUnicodeReader.__exit__ù   r]   r   c                 ó   • U $ r(   r3   rL   s    r   Ú__iter__ÚUnicodeReader.__iter__ý   s   € Øˆr   )
r=   r{   rz   r!   r   r    r7   rx   rF   ry   r(   )rj   rk   rl   rm   rn   ÚLinesOrPathr   r   r   r<   rA   rM   r�   r�   r[   r¥   rs   r3   r   r   r   r   ˜   sK   † ñð. 6:ñ .àð .ð ˜e G¨S LÑ1Ñ2õ .òDò òò$õr   r   c                   ó,   ^ • \ rS rSrSrU 4S jrSrU =r$ )r   i  z°
A `UnicodeReader` yielding (lineno, row) pairs, where "lineno" is the 1-based number of the
the **text line** where the (possibly multi-line) row data starts in the DSV file.
c                 óB   >• [         TU ]  5       nU R                  S-   U4$ )z9
:return: a pair (1-based line number in the input, row)
r	   )Úsuperr�   rx   ©r@   r+   Ú	__class__s     €r   r�   Ú$UnicodeReaderWithLineNumber.__next__  s%   ø€ ô
 ‰gÑÓ ˆØ�{‰{˜Q‰ Ð#Ð#r   r3   )rj   rk   rl   rm   rn   r�   rs   Ú__classcell__©r¬   s   @r   r   r     s   ø† ñ÷$ó $r   r   c                   óª   ^ • \ rS rSrSr   SS\\\      S\\   S\\   4U 4S jjjr\	S\\\      4U 4S jj5       r
S\4U 4S	 jjrS\4S
 jrSrU =r$ )r   i  a  
A `UnicodeReader` yielding one `dict` per row.

:param f: As for :class:`UnicodeReader`
:param fieldnames:

.. code-block:: python

    >>> with UnicodeDictReader(
    ...         'tests/fixtures/frictionless-data.csv',
    ...         dialect=Dialect(delimiter='|', header=False),
    ...         fieldnames=[str(i) for i in range(1, 11)]) as reader:
    ...     for row in reader:
    ...         print(row)
    ...         break
    ...
    OrderedDict([('1', 'FK'), ('2', 'Year'), ('3', 'Location name'), ('4', 'Value'),
    ('5', 'binary'), ('6', 'anyURI'), ('7', 'email'), ('8', 'boolean'), ('9', 'array'),
    ('10', 'geojson')])

Ú
fieldnamesÚrestkeyÚrestvalc                 óZ   >• X l         X0l        X@l        SU l        [        TU ]  " U40 UD6  g ©Nr   )Ú_fieldnamesr²   r³   Úline_numrª   rA   )r@   r    r±   r²   r³   r7   r¬   s         €r   rA   ÚUnicodeDictReader.__init__&  s.   ø€ ð &ÔØŒØŒØˆŒÜ‰Ò˜Ñ!˜bÓ!r   r   c                 ól  >• U R                   c   [        TU ]	  5       U l         U R                  R
                  U l        U R                   (       aK  [        [        U R                   5      5      [        U R                   5      :w  a  [        R                  " S5        U R                   $ ! [         a     N�f = f)z:Get the fieldnames, i.e. the dictionary keys for the rows.zDuplicate column names!)
r¶   rª   r�   ÚStopIterationry   r·   Úlenr”   ÚwarningsÚwarn)r@   r¬   s    €r   r±   ÚUnicodeDictReader.fieldnames3  s’   ø€ ð ×ÑÑ#ðÜ#(¡7Ñ#3Ó#5�Ô ð Ÿ™×,Ñ,ˆŒØ××Ü”3�t×'Ñ'Ó(Ó)¬S°×1AÑ1AÓ-BÓBÜ—’Ð7Ô8Ø×ÑÐøô !ó Ùðús   �B& Â&
B3Â2B3c                 óè   >• U R                   S:X  a  U R                    [        TU ]  5       nU R                  R                   U l         U/ :X  a  [        TU ]  5       nU/ :X  a  M  U R                  U5      $ rµ   )r·   r±   rª   r�   ry   Úitemr«   s     €r   r�   ÚUnicodeDictReader.__next__A  sa   ø€ Ø�=‰=˜AÓà�OŠOÜ‰gÑÓ ˆØŸ™×,Ñ,ˆŒð
 �R‹iÜ‘'Ñ"Ó$ˆCð �R�ià�y‰y˜‹~Ðr   c                 ó(  • [         R                  " S [        U R                  U5       5       5      n[	        U R                  5      n[	        U5      nX4:  a  XS X R
                  '   U$ X4:”  a$  U R                  US  H  nU R                  X%'   M     U$ )zTurn a row into a dict.c              3   ó,   #   • U  H
  u  pX4v •  M     g 7fr(   r3   )rŠ   ÚkÚvs      r   r‹   Ú)UnicodeDictReader.item.<locals>.<genexpr>Q  s   é € Ð#QÒ7P©t¨q Q¥FÒ7Pùs   ‚N)ÚcollectionsÚOrderedDictÚzipr±   r»   r²   r³   )r@   r+   ÚdÚlfÚlrÚkeys         r   rÀ   ÚUnicodeDictReader.itemO  s�   € ä×#Ò#Ñ#Q´s¸4¿?¹?ÈCÔ7PÓ#QÓQˆÜ�—‘Ó!ˆÜ�‹XˆØ‹7Ø! #˜hˆA�l‰l‰Oð ˆð ‹WØ—‘ r sÓ+�ØŸ™�“ñ ,àˆr   )r¶   r·   r²   r³   )NNN)rj   rk   rl   rm   rn   r   rr   r<   rA   Úpropertyr±   ÚDictRowTyper�   rÀ   rs   r®   r¯   s   @r   r   r     s�   ø† ñð2 /3Ø%)Ø%)ñ"ð !  c¡Ñ+ð"ð ˜c‘]ð	"ð
 ˜c‘]÷"ð "ð ð ˜H T¨#¡YÑ/ö  ó ð ð˜+÷ ð
˜;÷ 
ò 
r   r   c                   óf   • \ rS rSrSr\" \R                  5      r\	R                  S 5       rS rSrg)r   i\  zô
A `UnicodeReader` yielding one `namedtuple` per row.

.. note::

    This reader has some limitations, notably that fieldnames must be normalized to be
    admissible Python names, but also bad performance (compared with `UnicodeDictReader`).
c                 ó‚   • [        [        U R                  U R                  5      5      n[        R
                  " SU5      $ )zI
Creates a namedtuple class suitable for the columns of the CSV content.
ÚRow)rr   ÚmapÚ_normalize_fieldnamer±   rÇ   Ú
namedtuple)r@   r±   s     r   ÚclsÚNamedTupleReader.clsh  s2   € ô
 œ#˜d×7Ñ7¸¿¹ÓIÓJˆ
Ü×%Ò% e¨ZÓ8Ð8r   c                 ó.  • [         R                  X5      nU R                   H  nUR                  US5        M     U R                  " S0 UR                  5        VVs0 s H(  u  pEX@R                  ;   d  M  U R                  U5      U_M*     snnD6$ s  snnf )zCreate a namedtuple from a row.Nr3   )r   rÀ   r±   Ú
setdefaultr×   ÚitemsrÕ   )r@   r+   rÊ   r   rÄ   rÅ   s         r   rÀ   ÚNamedTupleReader.itemp  s€   € ä×"Ñ" 4Ó-ˆØ—O”OˆDØ�L‰L˜˜tÖ$ñ $à�xŠxñ _Ø;<¿7¹7¼9Ô]º9±4°1ÈÏ_É_ÑH\Ó.ˆt×(Ñ(¨Ó+¨QÒ.¹9Ò]ñ_ð 	_ùÛ]s   ÁBÁ5Br3   N)rj   rk   rl   rm   rn   Ústaticmethodr
   Únormalize_namerÕ   Ú	functoolsÚcached_propertyr×   rÀ   rs   r3   r   r   r   r   \  s8   † ññ (¨×(<Ñ(<Ó=Ðà×Ññ9ó ð9õ_r   r   Úlines_or_fileÚnamedtuplesÚdictsc              +   óä   #   • U(       a  U(       a  [        S5      eU(       a  [        nOU(       a  [        nO[        nU" U 4SU0UD6 nU Sh  v•N   SSS5        g N! , (       d  f       g= f7f)ac  Convenience factory function for csv reader.

:param lines_or_file: Content to be read. Either a file handle, a file path or a list    of strings.
:param namedtuples: Yield namedtuples.
:param dicts: Yield dicts.
:param encoding: Encoding of the content.
:param kw: Keyword parameters are passed through to csv.reader.
:return: A generator over the rows.
z:either namedtuples or dicts can be chosen as output formatr   N)Ú
ValueErrorr   r   r   )rá   râ   rã   r   r7   Ú_readerÚrs          r   r   r   y  s[   é € ö –uÜÐUÓVÐVÞÜ"‰Þ	Ü#‰äˆá	�Ñ	8¨Ð	8°RÒ	8¸AØ�ˆ÷ 
9Ð	8Ù÷ 
9Õ	8üs0   ‚AA0Á	AÁAÁAÁ	A0ÁAÁ
A-Á)A0ÚfnameÚvisitorc                 ó$  • [         R                  " U 5      n U R                  5       (       d   e[        R                  " SS9 n[         R                  " UR
                  5      nSSS5        [        U 40 UD6 n[        W40 UD6 n[        U5       H#  u  pxU" Xx5      nUc  M  UR                  U5        M%     SSS5        SSS5        [        R                  " WU 5        g! , (       d  f       N‚= f! , (       d  f       N?= f! , (       d  f       NH= f)a4  Utility function to rewrite rows in dsv files.

:param fname: Path of the dsv file to operate on.
:param visitor: A callable that takes a line-number and a row as input and returns a     (modified) row or None to filter out the row.
:param kw: Keyword parameters are passed through to csv.reader/csv.writer.
F©ÚdeleteN)rG   rH   Úis_fileÚtempfileÚNamedTemporaryFiler   r   r   rc   r_   ÚshutilÚmove)	rè   ré   r7   ÚfpÚtmpÚreader_r?   rg   r+   s	            r   r   r   ˜  sÉ   € ô �LŠL˜Ó€EØ�=‰=�?‰?Ðˆ?Ü	×	$Ò	$¨EÒ	2°bÜ�lŠl˜2Ÿ7™7Ó#ˆ÷ 
3ô 
�uÑ	# Ò	# wÜ˜3Ñ% "Ò%¨Ü# GÖ,‘�Ù˜a“o�Ø“?Ø—O‘O CÖ(ñ -÷ &÷ 
$ô ‡K‚K��UÕ÷ 
3Õ	2ú÷ &Õ%ú÷ 
$Õ	#ús6   Á!CÁ7DÂC0Â"C0Â7DÃ
C-Ã0
C>	Ã:DÄ
Dra   c                 ó  • [         R                  " SS9 n[        R                  " UR                  5      nSSS5        [        R                  " U 5      n [        W5       nU R                  5       (       a.  [        U 5       nU H  nUR                  U5        M     SSS5        UR                  U5        SSS5        [        R                  " X05        g! , (       d  f       N£= f! , (       d  f       NO= f! , (       d  f       NG= f)z
Add rows to a CSV file.
Frë   N)rî   rï   rG   rH   r   r   Úexistsr   r_   rh   rð   rñ   )rè   ra   rò   ró   r?   rô   r+   s          r   r   r   ®  s³   € ô 
×	$Ò	$¨EÒ	2°bÜ�lŠl˜2Ÿ7™7Ó#ˆ÷ 
3ô �LŠL˜Ó€EÜ	�sÔ	˜vØ�<‰<�>‰>Ü˜uÔ%¨Û"�CØ—O‘O CÖ(ñ #÷ &ð 	×Ñ˜Ô÷ 
ô ‡K‚K�Õ÷ 
3Õ	2ú÷ &Õ%ú÷ 
Õ	ús/   •!CÁ!C5Â C$ÂC5Ã
C!Ã$
C2	Ã.C5Ã5
DÚfilter_c                 óH   • [        U5      n[        X40 UD6  UR                  $ )aƒ  Rewrite a dsv file, filtering the rows.

:param fname: Path to dsv file
:param filter_: callable which accepts a `dict` with a row's data as single argument    returning a `Boolean` indicating whether to keep the row (`True`) or to discard it     `False`.
:param kw: Keyword arguments to be passed `UnicodeReader` and `UnicodeWriter`.
:return: The number of rows that have been removed.
)Ú
DictFilterr   Úremoved)rè   r÷   r7   s      r   r   r   ¿  s%   € ô ˜Ó!€GÜˆEÑ!˜bÒ!Ø�?‰?Ðr   c                   ód   • \ rS rSrSrS\\\\4   /\4   4S jr	S\
S\\   S\\\      4S jrS	rg
)rù   iÎ  zMUtility to apply a filter to a row as dict, while iterating over rows a list.r÷   c                 ó,   • S U l         Xl        SU l        g rµ   )ÚheaderÚfilterrú   )r@   r÷   s     r   rA   ÚDictFilter.__init__Ð  s   € Ø+/ˆŒØŒØˆ�r   rg   r+   r   c                 óÆ   • US:X  a  X l         U$ U(       aL  [        [        U R                   U5      5      nU R                  U5      (       a  U$ U =R                  S-  sl        g )Nr   r	   )rý   rd   rÉ   rþ   rú   )r@   rg   r+   rÀ   s       r   Ú__call__ÚDictFilter.__call__Õ  sP   € Ø�‹6ØŒKØˆJÞÜœ˜DŸK™K¨Ó-Ó.ˆDØ�{‰{˜4× Ñ Ø�
Ø�LŠL˜AÑ�LØr   )rþ   rý   rú   N)rj   rk   rl   rm   rn   r   rd   r<   ÚboolrA   Úintrr   r   r  rs   r3   r   r   rù   rù   Î  sM   † ÙWð ¨$¨s°C¨x©.Ð)9¸4Ð)?Ñ @ô ð
	˜#ð 	 D¨¡Ið 	°(¸4À¹9Ñ2E÷ 	r   rù   )FFr#   )-rn   rI   r:   r   rð   Útypingr   r   r   r   rG   rî   r¼   rß   rÇ   Úcollections.abcr   r   rE   r
   Údsv_dialectsr   Ú__all__r<   rH   ro   r§   rÈ   rr   rÐ   r   r   r   r   r   r   r  r   ry   r  r   r   rd   r   rù   r3   r   r   Ú<module>r	     s©  ðñó 
Û 
Û Û ß 0Ó 0Û Û Û Û Û ß /å Ý !ò€ð ��g—l‘lÐ"Ñ#€Ø�H˜b (¨3¡-Ð/Ñ0€à×%Ñ% c¨5°°d¸3±i°Ñ+@Ð&@ÑA€ð( ð (¨ô (÷
fñ f÷Rfñ fôR$ -ô $ôJ˜ô JôZ_Ð(ô _ð< ,1Ø%*Ø'.ñ˜Kð Ø" 4™.ðà˜T‘Nðð   ‘}ðð  õ	ð8 
€ð�8ð  h°°T¸#±YÐ/?ÀÀtÈTÐRUÉYÀÑAWÐ/WÑ&Xô ð,�Hð  T¨#¡Yô ð"˜xð °(¸D¸6À4¸<Ñ2Hð ÐSVô ÷ò r   