zmc
2023-10-12 ed135d79df12a2466b52dae1a82326941211dcc9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
U
¬ý°d"¿ã@sLddlmZddlmZmZddlZddlmZddlZddl    Z    ddl
m Z m Z m Z mZmZmZmZmZmZmZddlZddlmZddlmZmZmZddlmZmZdd    l m!Z!dd
l"m#Z#dd l$m%Z%m&Z&dd l'm(Z(m)Z)e rôdd l*m+Z+m,Z,dZ-Gdd„de(ƒZ.Gdd„dejƒZ/Gdd„de.ƒZ0ddœdd„Z1dddœdd„Z2dS)é)Ú annotations)ÚabcÚ defaultdictN)ÚStringIO)
ÚIOÚ TYPE_CHECKINGÚ DefaultDictÚHashableÚIteratorÚListÚLiteralÚMappingÚSequenceÚcast)Úlib)Ú    ArrayLikeÚ ReadCsvBufferÚScalar)ÚEmptyDataErrorÚ ParserError)Ú
is_integer)Ú is_dict_like)Ú dedup_namesÚis_potential_multi_index)Ú
ParserBaseÚparser_defaults)ÚIndexÚ
MultiIndexucs eZdZdddœ‡fdd„ Zdddœdd„ZdWd
d d œd d„Zdddœdd„ZdXd
d dœdd„Zdddœdd„Zddœdd„Z    d d!d"d d#œd$d%„Z
d&dœd'd(„Z d&d&d)œd*d+„Z d&d,d-œd.d/„Z d&dœd0d1„Zd2d"dd3œd4d5„Zd"d6d7œd8d9„Zd:d:d;œd<d=„Zd:d:d;œd>d?„Zd:d:d;œd@dA„Zd:d2d2d:dBœdCdD„Zd:d:d;œdEdF„ZddœdGdH„ZdIZdJdKdLœdMdN„Zd:ddOœdPdQ„ZdYd
d:d œdRdS„Zd:d:dTœdUdV„Z‡ZS)ZÚ PythonParserzReadCsvBuffer[str] | listÚNone©ÚfÚreturnc
 s~tƒ |¡dˆ_gˆ_dˆ_dˆ_|dˆ_tˆjƒrBˆjˆ_n‡fdd„ˆ_t    |dƒˆ_
|dˆ_ |dˆ_ t ˆj tƒrŠtˆj ƒˆ_ |d    ˆ_|d
ˆ_|d ˆ_|d ˆ_|d ˆ_|dˆ_|dpÐdˆ_dˆ_d|krì|dˆ_|dˆ_|dˆ_|dˆ_|dˆ_t |tƒr2ttt|ƒˆ_nt|dƒsBt‚ˆ  |¡dˆ_!ˆ "¡\}ˆ_#ˆ_$ˆ %|ˆj&¡\ˆ_'ˆ_&ˆ_(}tˆj'ƒˆ_)ˆj*sˆ +ˆj'¡\}ˆ_)ˆ_'dˆ_,ˆj&dkrÂ|ˆ_&ˆj!dkrâtt-t.ˆj'ƒƒƒˆ_!ˆ /ˆj'¡ˆ_0d}ˆj1r ˆ 2ˆj!ˆj'¡}|ˆ_3t.ˆjƒdkr*t4dƒ‚t5 6ˆj¡}ˆjdkrPd|›d}nt5 6ˆj¡}    d|    ›d|›d}t5 7|¡ˆ_8dS)zN
        Workhorse function for processing nested list into DataFrame
        NrÚskiprowscs
|ˆjkS©N)r#)Úx©Úself©úVd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pandas/io/parsers/python_parser.pyÚ<lambda>Oóz'PythonParser.__init__.<locals>.<lambda>Ú
skipfooterÚ    delimiterÚ    quotecharÚ
escapecharÚ doublequoteÚskipinitialspaceÚlineterminatorÚquotingÚskip_blank_linesÚnamesFÚhas_index_namesÚverboseÚ    thousandsÚdecimalÚcommentÚreadlineTéz'Only length-1 decimal markers supportedz^[\-\+]?[0-9]*(z [0-9]*)?([0-9]?(E|e)\-?[0-9]+)?$z^[\-\+]?([0-9]+z    |[0-9])*()9ÚsuperÚ__init__ÚdataÚbufÚposÚline_posr#ÚcallableÚskipfuncÚ_validate_skipfooter_argr,r-r.Ú
isinstanceÚstrr/r0r1r2r3r4Z names_passedr6r7r8r9r:Úlistrr
ÚhasattrÚAssertionErrorÚ _make_readerÚ _col_indicesÚ_infer_columnsÚnum_original_columnsÚ unnamed_colsZ_extract_multi_indexer_columnsÚ index_namesÚcolumnsÚ    col_namesÚ
orig_namesZ_has_complex_date_colÚ_get_index_nameZ_name_processedÚrangeÚlenZ_validate_parse_dates_presenceZ_parse_date_colsZ parse_datesZ_set_noconvert_dtype_columnsÚ_no_thousands_columnsÚ
ValueErrorÚreÚescapeÚcompileÚnum)
r'r!ÚkwdsrQÚ_rPZno_thousands_columnsr9Úregexr8©Ú    __class__r&r)r>?s” 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ü þû ÿ  ÿ   ÿzPythonParser.__init__úIO[str] | ReadCsvBuffer[str]c sBˆj‰ˆdkstˆƒdkr$ˆjr*tdƒ‚G‡fdd„dtjƒ}|}ˆdk    rTˆ|_n¾ˆ ¡}ˆ |gg¡d}ˆ ˆj    ¡s~|s¨ˆj    d7_    ˆ ¡}ˆ |gg¡d}qnt
t t |ƒ}|d}ˆj    d7_    ˆj d7_ t ¡ |¡}|j|_tjt|ƒ|d}ˆj t|ƒ¡tjˆ|dd}    n‡‡fd    d
„}
|
ƒ}    |    ˆ_dS) Nr<z<Custom line terminators not supported in python parser (yet)cs4eZdZ”jZ”jZ”jZ”jZ”jZ”jZdZ    dS)z,PythonParser._make_reader.<locals>.MyDialectÚ
N)
Ú__name__Ú
__module__Ú __qualname__r-r.r/r0r1r3r2r(r&r(r)Ú    MyDialect»srgr)ÚdialectT)rhÚstrictc3s@ˆ ¡}t ˆ¡}| | ¡¡VˆD]}| | ¡¡Vq&dSr$)r;rYr[ÚsplitÚstrip)ÚlineÚpat)r!Úsepr(r)Ú_readås
 
z(PythonParser._make_reader.<locals>._read)r-rVr2rXÚcsvÚDialectr;Ú_check_commentsrDrArr rGrBÚSnifferÚsniffÚreaderrr@ÚextendrHr?) r'r!rgZdiarlÚlinesZ    lines_strÚsniffedZline_rdrruror()r!r'rnr)rK²s8ÿ        zPythonParser._make_readerNz
int | NonezRtuple[Index | None, Sequence[Hashable] | MultiIndex, Mapping[Hashable, ArrayLike]])Úrowsr"cCs"z| |¡}Wn*tk
r8|jr*g}n
| ¡‚YnXd|_t|jƒ}t|ƒsœt|jt|j|j    ƒƒ}| 
||j    |j |j ¡\}}}|  ||j¡}|||fSt|dƒ}d}    |jrÒ|t|ƒkrÒ|d}    |dd…}| |¡}
| |
¡\} }| | ¡} | || ¡\}} | | |
||    ¡\}} || | fS)NFrr<)Ú
_get_linesÚ StopIterationZ _first_chunkÚcloserHrSrVrrÚ    index_colZ_get_empty_metarPÚdtypeZ_maybe_make_multi_index_columnsrRÚcount_empty_valsr6Ú _rows_to_colsÚ_exclude_implicit_indexÚ _convert_dataZ_do_date_conversionsZ _make_index)r'ryÚcontentrQr5ÚindexZcol_dictZ conv_columnsZcount_empty_content_valsZ indexnamerowÚalldatar?Z    conv_dataZresult_columnsr(r(r)ÚreadõsR
þþü
 
 
 
ÿzPythonParser.readzlist[np.ndarray]z8tuple[Mapping[Hashable, np.ndarray], Sequence[Hashable]])r…r"cs\t|jt|j|jƒƒ}d‰|jr*t|jƒ‰tˆƒ‰| |ˆ¡‡‡‡fdd„t|ƒDƒ|fS)Nrcs&i|]\}}|ˆkr|ˆ|ˆ“qSr(r()Ú.0ÚiÚname©r…Z len_alldataÚoffsetr(r)Ú
<dictcomp>Csz8PythonParser._exclude_implicit_index.<locals>.<dictcomp>)rrSrr}Ú_implicit_indexrVZ_check_data_lengthÚ    enumerate)r'r…r5r(rŠr)r.s"þþ
 ÿþz$PythonParser._exclude_implicit_index)Úsizer"cCs|dkr|j}|j|dS)N)ry)Ú    chunksizer†)r'rr(r(r)Ú    get_chunkHszPythonParser.get_chunkzMapping[Hashable, np.ndarray]zMapping[Hashable, ArrayLike])r?r"c    Csž| |j¡}| |j¡}i}i}t|jtƒr||jD]F}|j|}|j|}t|tƒrh||jkrh|j|}|||<|||<q2n |j}|j}|     ||||j
||¡Sr$) Z_clean_mappingÚ
convertersr~rFÚ    na_valuesÚdictZ
na_fvaluesÚintrSZ_convert_to_ndarraysr7)    r'r?Z
clean_convZ clean_dtypesZclean_na_valuesZclean_na_fvaluesÚcolZna_valueZ    na_fvaluer(r(r)r‚Rs,   
 
 
 
 úzPythonParser._convert_dataz9tuple[list[list[Scalar | None]], int, set[Scalar | None]]©r"c sü|j‰d}d}tƒ}d|_|jdk    rô|j}t|tttjfƒrft    |ƒdk}|rpt|ƒ|ddg}n
d}|g}g}t
|ƒD]`\}}z"|  ¡}    |j |kr¤|  ¡}    qWntk
r¼}
zôd|j krÔ|kr@nnh|rê||dkr@ttt|r|dd…n|ƒƒ} dd | ¡›dt    | ƒ›d    } td
| ›d |j ›d ƒ|
‚|rŒ|dkrŒ|r^| ¡| dgt    |dƒ¡|||fWY¢*S|jsžtd ƒ|
‚|jdd…}    W5d}
~
XYnXg‰g‰t
|    ƒD]V\} }|dkr|rød| ›d|›}n
d| ›}ˆ | ¡ˆ |¡n
ˆ |¡qÎ|s*ttƒ}‡fdd„tt    ˆƒƒDƒˆ}|D]Ð} ˆ| }|}||}|dkr|dkr¼|d||<|›d|›}|ˆkr°|d7}n||}qx|jdk    rt|jƒr|j |¡dk    r|j |¡dkr|j ||j |¡i¡|ˆ| <|d||<qVn~|r¨||dkr¨t    ˆƒ}|j}|dk    r^t    |ƒnd}t    ˆƒ}||kr‚|||ksŒ|dkr¨d}dg|‰|jdg|_| ˆ¡| ‡fdd„ˆDƒ¡t    |ƒdkr|t    ˆƒ}q||rî| ¡ˆdk    ràz |  ¡}Wntk
rd}YnX|dkr.dnt    |ƒ}t    ˆƒt    |dƒkrbt    ˆƒ|krbtdƒ‚t    |ƒdkrxtdƒ‚|j dk    r”| !|ˆ|¡nt    ˆƒ}|j"dk    rØt    ˆƒt    |j"ƒkr؇fdd„t#|j"ƒDƒg}nˆg}n| !||d|¡}nþz |  ¡}    Wn@tk
r@}
z ˆs$td ƒ|
‚ˆdd…}    W5d}
~
XYnX|    |_t    |    ƒ}|}ˆs|tt|ƒƒg}| !||d|¡}nv|j dks–t    ˆƒ|kr°| !ˆgˆ|¡}t    ˆƒ}nBt$|j ƒsØt    ˆƒt    |j ƒkrØtdƒ‚| !ˆgˆ|¡ˆg}|}|||fS)NrTr<éÿÿÿÿFú[ú,z
], len of z, zPassed header=z    but only z lines in filezNo columns to parse from fileÚz    Unnamed: Z_level_csg|]}|ˆkr|‘qSr(r(©r‡rˆ)Úthis_unnamed_colsr(r)Ú
<listcomp>Àsþz/PythonParser._infer_columns.<locals>.<listcomp>Ú.csh|] }ˆ|’qSr(r(rœ)Ú this_columnsr(r)Ú    <setcomp>ðsz.PythonParser._infer_columns.<locals>.<setcomp>zHNumber of passed names did not match number of header fields in the filez*Cannot pass names with multi-index columnscsg|] }ˆ|‘qSr(r(rœ)r5r(r)ržs)%r5ÚsetÚ _header_lineÚheaderrFrHÚtupleÚnpZndarrayrVrŽÚ_buffered_linerBÚ
_next_liner{ÚmaprGÚjoinrXÚ _clear_bufferÚappendrrr•rUr~rÚgetÚupdater}r@Ú    TypeErrorÚusecolsÚ_handle_usecolsrLÚsortedrC)r'rNZ clear_bufferrOr¤Zhave_mi_columnsrQÚlevelÚhrrlÚerrZjoiÚmsgrˆÚcZcol_nameÚcountsZcol_loop_orderr–Zold_colZ    cur_countÚlcZsicZicZ unnamed_countÚ
first_lineZlen_first_data_rowZncolsr()r5r rr)rMus&  
ÿ
ÿ ÿý
 
 
 
 
 
þü
 
 
 
 ÿþýü"
 
 
 
 
$ÿ ÿÿ 
ÿ
 ÿzPythonParser._infer_columnszlist[list[Scalar | None]]zlist[Scalar | None]r•)rQÚ usecols_keyrNr"c    sú|jdk    röt|jƒr$| |j|¡‰n¶tdd„|jDƒƒr¬t|ƒdkrLtdƒ‚g‰|jD]R}t|tƒržzˆ |     |¡¡Wq¨tk
rš| 
|j|¡Yq¨XqVˆ |¡qVn.‡fdd„|jDƒ}|rÔt d|›d    ƒ‚|j‰‡fd
d„|Dƒ}t ˆƒ|_ |S) zb
        Sets self._col_indices
 
        usecols_key is used if there are string usecols.
        Ncss|]}t|tƒVqdSr$)rFrG)r‡Úur(r(r)Ú    <genexpr>Nsz/PythonParser._handle_usecols.<locals>.<genexpr>r<z4If using multiple headers, usecols must be integers.csg|]}|ˆkr|‘qSr(r()r‡r–)rNr(r)rž^sz0PythonParser._handle_usecols.<locals>.<listcomp>z;Defining usecols without of bounds indices is not allowed. z are out of bounds.cs"g|]}‡fdd„t|ƒDƒ‘qS)csg|]\}}|ˆkr|‘qSr(r()r‡rˆÚn©Ú col_indicesr(r)ržisz;PythonParser._handle_usecols.<locals>.<listcomp>.<listcomp>)rŽ)r‡Úcolumnr¿r(r)ržhsÿ)r°rCZ_evaluate_usecolsÚanyrVrXrFrGr¬r„Z_validate_usecols_namesrr²rL)r'rQr»rNr–Zmissing_usecolsr()rÀrNr)r±?s:
 
 ÿ
 
 
ÿ
ÿ
þ
zPythonParser._handle_usecolsz list[Scalar]cCs$t|jƒdkr|jdS| ¡SdS)zH
        Return a line from buffer, filling buffer if required.
        rN)rVr@r¨r&r(r(r)r§os
zPythonParser._buffered_line)Ú    first_rowr"c    CsÖ|s|St|dtƒs|S|ds&|S|dd}|tkr>|S|d}t|ƒdkr´|d|jkr´d}|d}|dd… |¡d}|||…}t|ƒ|dkrÀ|||dd…7}n |dd…}|g}||dd…S)a-
        Checks whether the file begins with the BOM character.
        If it does, remove it. In addition, if there is quoting
        in the field subsequent to the BOM, remove it as well
        because it technically takes place at the beginning of
        the name, not the middle of it.
        rr<éN)rFrGÚ_BOMrVr.r„)    r'rÃZ    first_eltZ first_row_bomÚstartÚquoteÚendÚnew_rowZ new_row_listr(r(r)Ú_check_for_bomxs(
   zPythonParser._check_for_bomÚbool)rlr"cCs| ptdd„|DƒƒS)zô
        Check if a line is empty or not.
 
        Parameters
        ----------
        line : str, array-like
            The line of data to check.
 
        Returns
        -------
        boolean : Whether or not the line is empty.
        css|] }| VqdSr$r(©r‡r%r(r(r)r½ºsz.PythonParser._is_line_empty.<locals>.<genexpr>)Úall)r'rlr(r(r)Ú_is_line_empty­s zPythonParser._is_line_emptycCs¦t|jtƒrÈ| |j¡r:|jt|jƒkr*q:|jd7_q zp| |j|jg¡d}|jd7_|js†| |j|jd¡s‚|r†WqÆ|jr¨|     |g¡}|r¨|d}WqÆWq:t
k
rÂt ‚Yq:Xq:nª| |j¡rü|jd7_|jdk    sðt ‚t |jƒqÈ|j|jdd}|jd7_|dk    rü| |g¡d}|jr\|     |g¡}|rp|d}qrqü| |¡sr|rüqrqü|jdkrˆ| |¡}|jd7_|j |¡|S)Nr<r©Úrow_num)rFr?rHrDrArVrrr4rÎÚ_remove_empty_linesÚ
IndexErrorr{rJÚnextÚ_next_iter_linerÊrBr@r¬)r'rlÚretZ    orig_liner(r(r)r¨¼sR  ÿÿ     
 zPythonParser._next_linerG)r¶rÐr"cCsH|j|jjkrt|ƒ‚|j|jjkrDd|›d}tj ||d¡dS)a 
        Alert a user about a malformed row, depending on value of
        `self.on_bad_lines` enum.
 
        If `self.on_bad_lines` is ERROR, the alert will be `ParserError`.
        If `self.on_bad_lines` is WARN, the alert will be printed out.
 
        Parameters
        ----------
        msg: str
            The error message to display.
        row_num: int
            The row number where the parsing error occurred.
            Because this row number is displayed, we 1-index,
            even though we 0-index internally.
        zSkipping line z: rcN)Ú on_bad_linesÚBadLineHandleMethodÚERRORrÚWARNÚsysÚstderrÚwrite)r'r¶rÐÚbaser(r(r)Ú_alert_malformedôs
 zPythonParser._alert_malformedzlist[Scalar] | None)rÐr"c
Cs´z,|jdk    st‚t|jƒ}t|tƒs(t‚|WStjk
r®}zb|j|jj    |jj
fkr˜t |ƒ}d|ksnd|krrd}|j dkrŒd}|d|7}|  ||¡WY¢dSd}~XYnXdS)a[
        Wrapper around iterating through `self.data` (CSV source).
 
        When a CSV error is raised, we check for specific
        error messages that allow us to customize the
        error message displayed to the user.
 
        Parameters
        ----------
        row_num: int
            The row number of the line being parsed.
        Nz    NULL bytezline contains NULz„NULL byte detected. This byte cannot be processed in Python's native csv library at the moment, so please pass in engine='c' insteadrz¡Error could possibly be due to parsing errors in the skipped footer rows (the skipfooter keyword is only applied after Python's csv library has parsed all rows).ú. )r?rJrÓrFrHrpÚErrorrÖr×rØrÙrGr,rÞ)r'rÐrlÚer¶Úreasonr(r(r)rÔ s( 
þÿ
ÿ  zPythonParser._next_iter_lineúlist[list[Scalar]]©rwr"cCs|jdkr|Sg}|D]t}g}|D]\}t|tƒrD|j|ksD||jkrP| |¡q"|d| |j¡…}t|ƒdkrz| |¡q€q"| |¡q|S)Nr)r:rFrGr“r¬ÚfindrV)r'rwrÕrlÚrlr%r(r(r)rr;s&
ÿþý  
 zPythonParser._check_commentscCsNg}|D]@}t|ƒdks>t|ƒdkrt|dtƒr>|d ¡r| |¡q|S)a—
        Iterate through the lines and remove any that are
        either empty or contain only one whitespace value
 
        Parameters
        ----------
        lines : list of list of Scalars
            The array of lines that we are to filter.
 
        Returns
        -------
        filtered_lines : list of list of Scalars
            The same array of lines with the "empty" ones removed.
        r<r)rVrFrGrkr¬)r'rwrÕrlr(r(r)rÑPs
ÿ
þ ý
ý z PythonParser._remove_empty_linescCs |jdkr|S|j||jddS)Nr›©rwÚsearchÚreplace)r8Ú_search_replace_num_columns©r'rwr(r(r)Ú_check_thousandsjs
ÿzPythonParser._check_thousands)rwrèrér"c    Cs‚g}|D]t}g}t|ƒD]X\}}t|tƒrR||ksR|jrB||jksR|j | ¡¡s^| |¡q| | ||¡¡q| |¡q|Sr$)    rŽrFrGrWr\rèrkr¬ré)    r'rwrèrérÕrlrærˆr%r(r(r)rêrs$ÿþýýü  z(PythonParser._search_replace_num_columnscCs$|jtdkr|S|j||jddS)Nr9rŸrç)r9rrêrër(r(r)Ú_check_decimal…sÿzPythonParser._check_decimalcCs
g|_dSr$)r@r&r(r(r)r«szPythonParser._clear_bufferFzSequence[Hashable]z@tuple[Sequence[Hashable] | None, list[Hashable], list[Hashable]])rQr"c
Csxt|ƒ}t|ƒ}|jdk    r"|j}n&z | ¡}Wntk
rFd}YnXz | ¡}Wntk
rld}YnXd}|dk    r(|j}|dk    r˜t|ƒ|j}|dk    r(|jdk    r(|dk    r(t|ƒt|ƒ|jkr(ttt|ƒƒƒ|_|j    dd…|_    t
|ƒD]}|  d|¡qút|ƒ}t|ƒ|_|||fS|dkrXd|_ |jdkrRtt|ƒƒ|_d}n|  ||j¡\}}    |_|||fS)aÐ
        Try several cases to get lines:
 
        0) There are headers on row 0 and row 1 and their
        total summed lengths equals the length of the next line.
        Treat row 0 as columns and row 1 as indices
        1) Look for implicit index: there are more columns
        on row 1 than row 0. If this is true, assume that row
        1 lists index columns and row 0 lists normal columns.
        2) Get index from the columns if it was listed.
        NrFr<T)rHr£r¨r{r}rVrNr¤rUr@ÚreversedÚinsertrZ_clean_index_names)
r'rQrSrlZ    next_lineZimplicit_first_colsr}r·Z
index_namer^r(r(r)rT’sR
 
 
 
ÿþý 
 
 
 ÿ zPythonParser._get_index_name)rƒr"csöˆj}ˆjr|tˆjƒ7}tdd„|Dƒƒ}||krˆˆjdk    rˆˆjdkrˆˆjrZˆjnd}g}t|ƒ}t|ƒ}g}|D]œ\}}    t|    ƒ}
|
|kr tˆj    ƒr¼ˆ     |    ¡} | dk    rº| 
| ¡nNˆj    ˆj j ˆj j fkrˆj|||} | 
| |
f¡ˆj    ˆj j krqqz| 
|    ¡qz|D]j\} }
d|›d| d›d|
›} ˆjrttˆjƒdkrtˆjtjkrtd    }| d
|7} ˆ | | d¡qttj||d jƒ}ˆjròˆjdk    s´t‚ˆj‰ˆjr܇‡fd d „t|ƒDƒ}n‡fdd „t|ƒDƒ}|S)Ncss|]}t|ƒVqdSr$)rV©r‡Úrowr(r(r)r½åsz-PythonParser._rows_to_cols.<locals>.<genexpr>Frz    Expected z fields in line r<z, saw zXError could possibly be due to quotes being ignored when a multi-char delimiter is used.rß)Z    min_widthcs4g|],\}}|tˆjƒks,|tˆjƒˆkr|‘qSr()rVr}©r‡rˆÚa©rÀr'r(r)rž'süz.PythonParser._rows_to_cols.<locals>.<listcomp>csg|]\}}|ˆkr|‘qSr(r(ròr¿r(r)rž0s)rNrrVr}Úmaxr°r,rŽrCrÖr¬r×rØrÙrAr-r3rpÚ
QUOTE_NONErÞrHrZto_object_arrayÚTrLrJ)r'rƒZcol_lenÚmax_lenZfootersZ    bad_linesÚ iter_contentZ content_lenrˆÚ_contentZ
actual_lenZnew_lrÐr¶râZzipped_contentr(rôr)r€ßspÿþý 
 
 
 þ  ÿÿ þ
ýÿ  þ    
ÿzPythonParser._rows_to_colsc    Cs`|j}d}|dk    rPt|jƒ|krB|jd|…|j|d…}|_n|t|jƒ8}|dkrt|jtƒrÜ|jt|jƒkrzt‚|dkrž|j|jd…}t|jƒ}n |j|j|j|…}|j|}| |¡}| |¡||_n0g}zÚ|dk    rvd}|j    dk    r$|jdk    r$tt
|j    ƒt
t |jƒƒƒ}t ||ƒD]&}|jdk    sDt ‚|  t|jƒ¡q0t|ƒ}| |¡}| |¡nBd}|j|j|dd}|d7}|dk    rz|  |¡qzt|ƒ}WnBtk
rüt|ƒ}| |¡}| |¡t|ƒdkrø‚YnX|j|7_g|_n|}|jr0|d|j …}| |¡}|jrL| |¡}| |¡}| |¡S)Nrr<rÏ)r@rVrFr?rHrAr{Ú_remove_skipped_rowsrvr#r¢rUrJr¬rÓrÔr,rrr4rÑrìrí)    r'ryrwÚnew_rowsÚnew_posZ rows_to_skipr^Z len_new_rowsrÉr(r(r)rz5sl"
 
 
 
 
 
ÿ
 
 
 
 
 
 
zPythonParser._get_lines)rür"cs ˆjr‡fdd„t|ƒDƒS|S)Ncs$g|]\}}ˆ |ˆj¡s|‘qSr()rDrA)r‡rˆrñr&r(r)ržˆsz5PythonParser._remove_skipped_rows.<locals>.<listcomp>)r#rŽ)r'rür(r&r)rû†s
 
ÿz!PythonParser._remove_skipped_rows)N)N)N)rdrerfr>rKr†rr‘r‚rMr±r§rÊrÎr¨rÞrÔrrrÑrìrêrír«rrTr€rzrûÚ __classcell__r(r(r`r)r>s8sDÿ9ÿ
#K0    580MVQrc    @sbeZdZdZdddddddd    d
œd d „Zdddd dœdd„Zdddddœdd„Zd dœdd„ZdS)ÚFixedWidthReaderz(
    A reader of fixed-width lines.
    Nédrbz(list[tuple[int, int]] | Literal['infer']z
str | Nonezset[int] | Noner•r)r!Úcolspecsr-r:r#Ú infer_nrowsr"cCsÎ||_d|_|rd|nd|_||_|dkr>|j||d|_n||_t|jttfƒsht    dt
|ƒj ›ƒ‚|jD]Z}t|ttfƒrÀt |ƒdkrÀt|dt tjt
dƒfƒrÀt|dt tjt
dƒfƒsnt    d    ƒ‚qndS)
Nz
z
     Zinfer)rr#z;column specifications must be a list or tuple, input was a rÄrr<zEEach column specification must be 2 element tuple or list of integers)r!Úbufferr-r:Údetect_colspecsrrFr¥rHr¯ÚtyperdrVr•r¦Úinteger)r'r!rr-r:r#rZcolspecr(r(r)r>“s4    ÿ
ÿ
 ÿ
þýüÿzFixedWidthReader.__init__z    list[str])rr#r"cCsd|dkrtƒ}g}g}t|jƒD]4\}}||kr:| |¡| |¡t|ƒ|kr qVq t|ƒ|_|S)aÉ
        Read rows from self.f, skipping as specified.
 
        We distinguish buffer_rows (the first <= infer_nrows
        lines) from the rows returned to detect_colspecs
        because it's simpler to leave the other locations
        with skiprows logic alone than to modify them to
        deal with the fact we skipped some rows here as
        well.
 
        Parameters
        ----------
        infer_nrows : int
            Number of rows to read from self.f, not counting
            rows that are skipped.
        skiprows: set, optional
            Indices of rows to skip.
 
        Returns
        -------
        detect_rows : list of str
            A list containing the rows to read.
 
        N)r¢rŽr!r¬rVÚiterr)r'rr#Z buffer_rowsZ detect_rowsrˆrñr(r(r)Úget_rows¹s
 
 
zFixedWidthReader.get_rowszlist[tuple[int, int]]c súd dd„ˆjDƒ¡}t d|›d¡}ˆ ||¡}|s@tdƒ‚ttt|ƒƒ}t    j
|dt d}ˆj dk    r|‡fd    d„|Dƒ}|D](}|  |¡D]}    d||     ¡|     ¡…<qŽq€t     |d¡}
d
|
d
<t     ||
Adk¡d
} tt| ddd …| ddd …ƒƒ} | S) Nr›cSsg|]}d|›‘qS)ú\r(rÌr(r(r)ržãsz4FixedWidthReader.detect_colspecs.<locals>.<listcomp>z([^z]+)z(No rows from which to infer column widthr<)r~csg|]}| ˆj¡d‘qS)r)Ú    partitionr:rðr&r(r)ržësrrÄ)rªr-rYr[rrrõr©rVr¦Úzerosr•r:ÚfinditerrÆrÈZrollÚwhererHÚzip) r'rr#Ú
delimitersÚpatternryrøÚmaskrñÚmZshiftedÚedgesZ
edge_pairsr(r&r)rßs" 
 "z FixedWidthReader.detect_colspecsr—cs`ˆjdk    r@ztˆjƒ‰WqJtk
r<dˆ_tˆjƒ‰YqJXn
tˆjƒ‰‡‡fdd„ˆjDƒS)Ncs$g|]\}}ˆ||… ˆj¡‘qSr()rkr-)r‡Úfrom_Úto©rlr'r(r)ržsz-FixedWidthReader.__next__.<locals>.<listcomp>)rrÓr{r!rr&r(rr)Ú__next__õs
 
zFixedWidthReader.__next__)Nr)N)rN)rdrerfÚ__doc__r>rrrr(r(r(r)rÿŽs
ù&'ÿrÿc@s@eZdZdZdddœdd„Zdddœdd    „Zd
d
d œd d „ZdS)ÚFixedWidthFieldParserzl
    Specialization that Converts fixed-width fields into DataFrames.
    See PythonParser for details.
    zReadCsvBuffer[str]rr cKs,| d¡|_| d¡|_tj||f|ŽdS)Nrr)Úpoprrrr>)r'r!r]r(r(r)r>
s  zFixedWidthFieldParser.__init__rbcCs"t||j|j|j|j|jƒ|_dSr$)rÿrr-r:r#rr?)r'r!r(r(r)rKsúz"FixedWidthFieldParser._make_readerrãräcCsdd„|DƒS)z¿
        Returns the list of lines without the empty ones. With fixed-width
        fields, empty lines become arrays of empty strings.
 
        See PythonParser._remove_empty_lines.
        cSs"g|]}tdd„|Dƒƒr|‘qS)css"|]}t|tƒ p| ¡VqdSr$)rFrGrk)r‡rár(r(r)r½$szGFixedWidthFieldParser._remove_empty_lines.<locals>.<listcomp>.<genexpr>)rÂ)r‡rlr(r(r)rž!sþz=FixedWidthFieldParser._remove_empty_lines.<locals>.<listcomp>r(rër(r(r)rÑsþz)FixedWidthFieldParser._remove_empty_linesN)rdrerfrr>rKrÑr(r(r(r)rs
rr•r—cCstdd„|DƒƒS)Ncss"|]}|dks|dkrdVqdS)r›Nr<r()r‡Úvr(r(r)r½)sz#count_empty_vals.<locals>.<genexpr>)Úsum)Úvalsr(r(r)r(sr)r,r"cCs$t|ƒstdƒ‚|dkr tdƒ‚|S)að
    Validate the 'skipfooter' parameter.
 
    Checks whether 'skipfooter' is a non-negative integer.
    Raises a ValueError if that is not the case.
 
    Parameters
    ----------
    skipfooter : non-negative integer
        The number of rows to skip at the end of the file.
 
    Returns
    -------
    validated_skipfooter : non-negative integer
        The original input if the validation succeeds.
 
    Raises
    ------
    ValueError : 'skipfooter' was not a non-negative integer.
    zskipfooter must be an integerrzskipfooter cannot be negative)rrX)r,r(r(r)rE,s
rE)3Ú
__future__rÚ collectionsrrrpÚiorrYrÚÚtypingrrrr    r
r r r rrÚnumpyr¦Z pandas._libsrZpandas._typingrrrZ pandas.errorsrrZpandas.core.dtypes.commonrZpandas.core.dtypes.inferencerZpandas.io.commonrrZpandas.io.parsers.base_parserrrZpandasrrrÅrrÿrrrEr(r(r(r)Ú<module>s<  0        Xv$