U
    >vfT                  	   @   s  d dl m Z mZ d dlmZ d dlZd dlmZ d dlZd dlm	Z	 d dl
mZ d dlZd dlZd dlm  mZ d dlZd dlmZmZmZmZ d dlmZ d dlmZmZ d	d
dddgZej de!dgdej de!dgdej de!dgdej de!ddej de!ddgZ"e#e$dddZ%dd Z&ej'dd e"D e#ddd Z(ej'dd Z)ej'dd  Z*G d!d" d"Z+G d#d$ d$Z,dS )%    )datetimetime)partialN)Path)URLError)
BadZipFile)	DataFrameIndex
MultiIndexSeries)ArrowStringArrayStringArray.xls.xlsx.xlsm.xlsb.odsxlrdmarksopenpyxlpyxlsbodf)read_extreturnc                 C   s   | j d } | dkr|dkrdS | dkr2|dkr2dS |dkrF| dkrFdS | dkrZ|dkrZdS |dkrn| dkrndS | d	kr|dkrdS d
S )zm
    Filter out invalid (engine, ext) pairs instead of skipping, as that
    produces 500+ pytest.skips.
    r   r   r   Fr   r   r   r   r   T)values)enginer    r   F/tmp/pip-unpacked-wheel-vdrwu74i/pandas/tests/io/excel/test_readers.py_is_valid_engine_ext_pair:   s    
r   c                 C   s    | j |f }tj|| jd}|S )z
    engine gives us a pytest.param object with some marks, read_ext is just
    a string.  We need to generate a new pytest.param inheriting the marks.
    r   )r   pytestparamr   )r   r   r   	new_paramr   r   r   _transfer_marksO   s    r#   c                 C   s*   g | ]"}t D ]}t||rt||qqS r   )read_ext_paramsr   r#   ).0Zengextr   r   r   
<listcomp>Z   s
    
r'   )paramsidsc                 C   s   | j S )zS
    Fixture for Excel reader engine and read_ext, only including valid pairs.
    )r!   )requestr   r   r   engine_and_read_extY   s    r+   c                 C   s   | \}}|S Nr   r+   r   r   r   r   r   r   i   s    r   c                 C   s   | \}}|S r,   r   r-   r   r   r   r   o   s    r   c                   @   s  e Zd Zejdddd Zdd Zdd Zd	d
 Zdd Z	ej
ddddgdddgdddgdddgdddgdddggdd Zej
dddgddggdd Zdd Zdd Zdd Zdd Zdd  Zej
d!d"d#gd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zej
d6d"edd#dd7gd8d9d:d;gdd#dd7gd<d=ejd>gd?fd@dAeed?ee dd#dd7gd@dBe d8d9d:d;gdAdBdCdDdEdFgdGdHejdIgd?fgdJdK Z!dLdM Z"dNdO Z#e$%dPdQdR Z&ej
dSi dGfdTdUidfgdVdW Z'dXdY Z(ej
dZd[ed\d]gifd^ed_gd`fgdadb Z)dcdd Z*dedf Z+dgdh Z,didj Z-dkdl Z.dmdn Z/ej
0dodpdq Z1drds Z2dtdu Z3dvdw Z4ej
dxdddgddgdydzdygdydzggd{d| Z5d}d~ Z6dd Z7ej
j8e9j8ddddd Z:e$j;ej
j<dd Z=ej
j<dd Z>ej
j?dd Z@dd ZAe$%ddd ZBdd ZCdd ZDdd ZEej
ddejdddgfdejgd7 fgdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNej
dddddgdd"fddd"ddgd"fddddgddgd"fddddgdd"fddd"d"dd#gfddd"d"dd fgdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTddĄ ZUddƄ ZVddȄ ZWd"S )TestReadersTZautousec                 C   s2   t tj|d}||ddd |td| dS )zG
        Change directory and set engine for read_excel calls.
        r   iodataexcel
read_excelN)r   pdr4   chdirsetattrselfr   datapathmonkeypatchfuncr   r   r   cd_and_set_enginev   s    zTestReaders.cd_and_set_enginec           	   	   C   sz   dd }| tjd| dddddd}td	| d
}t|}W 5 Q R X |d k	rZ|}n||dd   }||ksvtd S )Nc                 _   s   | j S r,   r0   )r9   argskwargsr   r   r   parser   s    z,TestReaders.test_engine_used.<locals>.parserparser   r   r   r   xlsxZxlsmZxlsbxlsZodstest1rb   )r7   r5   	ExcelFileopenr4   AssertionError)	r9   r   r   r;   r@   expected_defaultsfresultexpectedr   r   r   test_engine_used   s    zTestReaders.test_engine_usedc              	   C   sl   d}t jt|d tjd| dddd W 5 Q R X t jt|d  tjd| dd	gddd
 W 5 Q R X d S )Nz Passing an integer for `usecols`matchrE   Sheet1r      
sheet_name	index_colusecolsSheet2rG   rU   skiprowsrV   rW   r    raises
ValueErrorr5   r4   r9   r   msgr   r   r   test_usecols_int   s        zTestReaders.test_usecols_intc                 C   s   |dkr|j tjjdd |jddgd}tjd| dd	d	d
dgd}tjd| ddgd	d	d
dgd}tj	||dd tj	||dd d S )Nr   3Sheets containing datetimes not supported by pyxlsbreasonBCcolumnsrE   rR   r      rS   rT   rX   rG   rY   FZcheck_names
node
add_markerr    markxfailreindexr5   r4   tmassert_frame_equal)r9   r*   r   df_refdf1df2r   r   r   test_usecols_list   s,       	zTestReaders.test_usecols_listc                 C   sD  |dkr|j tjjdd |jdddgd}tjd| d	d
dd}tjd| ddgd
dd}tj	||dd tj	||dd |jddgd}tjd| d	d
dd}tjd| ddgd
dd}tj	||dd tj	||dd |jddgd}tjd| d	d
dd}tjd| ddgd
dd}tj	||dd tj	||dd d S )Nr   ra   rb   Ard   re   rf   rE   rR   r   zA:DrT   rX   rG   rY   Fri   zA,C,DzA,C:Drj   r9   r*   r   rr   rs   rt   df3r   r   r   test_usecols_str   sl       	      zTestReaders.test_usecols_strrW   r   rG   rS   c                 C   sT   |dkr|j tjjdd |ddg }tjd| dd|d	}tj||d
d d S )Nr   ra   rb   rv   re   rE   rR   r   rT   Fri   	rk   rl   r    rm   rn   r5   r4   rp   rq   )r9   r*   r   rW   rr   rN   rM   r   r   r   .test_usecols_diff_positional_int_columns_order   s       z:TestReaders.test_usecols_diff_positional_int_columns_orderrd   Dc                 C   sB   |ddg }t t||_tjd| d|d}tj||dd d S )Nrd   r|   rE   rR   rU   rW   Fri   )rangelenindexr5   r4   rp   rq   )r9   r   rW   rr   rN   rM   r   r   r   .test_usecols_diff_positional_str_columns_order	  s    z:TestReaders.test_usecols_diff_positional_str_columns_orderc                 C   sJ   |dkr|j tjjdd |}tjd| ddd}tj||dd	 d S )
Nr   ra   rb   rE   rR   r   rU   rV   Fri   rz   r9   r*   r   rr   rN   rM   r   r   r   test_read_excel_without_slicing  s    z+TestReaders.test_read_excel_without_slicingc                 C   sT   |dkr|j tjjdd |ddg }tjd| ddd	d
}tj||dd d S )Nr   ra   rb   re   r|   rE   rR   r   zA,D:ErT   Fri   rz   r   r   r   r   test_usecols_excel_range_str  s       z(TestReaders.test_usecols_excel_range_strc              	   C   s6   d}t jt|d tjd| ddd W 5 Q R X d S )NzInvalid column name: E1rP   rE   rR   zD:E1r}   r[   r^   r   r   r   $test_usecols_excel_range_str_invalid+  s    z0TestReaders.test_usecols_excel_range_str_invalidc              	   C   s>   d}t jt|d" tjd| ddgddgd W 5 Q R X d S )Nz(list indices must be integers.*, not strrP   rE   rR   rv   re   rT   r    r\   	TypeErrorr5   r4   r^   r   r   r   test_index_col_label_error1  s    z&TestReaders.test_index_col_label_errorc                 C   sX   t jd| ddddgd}tddd	gtg gd
 g gd
 dddgdd}t|| d S )NrE   Sheet3rv   rd   re   r   r|   EFrS   levelscodesnamesrg   r   )r5   r4   r   r
   rp   rq   r9   r   rM   rN   r   r   r   test_index_col_empty<  s      z TestReaders.test_index_col_emptyrV   Nrh   c                 C   sZ   t jd| d|d}tdddgddd	ggd
ddgd}|rJ||j| }t|| d S )NrE   Sheet4r   i1axi2byz
Unnamed: 0Zcol1Zcol2rf   )r5   r4   r   	set_indexrg   rp   rq   )r9   r   rV   rM   rN   r   r   r   test_index_col_with_unnamedG  s       z'TestReaders.test_index_col_with_unnamedc              	   C   s6   d}t jt|d tjd| dgd W 5 Q R X d S )NzEUsecols do not match columns, columns expected but not found: \['E'\]rP   rE   r   rW   r[   r^   r   r   r   %test_usecols_pass_non_existent_columnU  s    z1TestReaders.test_usecols_pass_non_existent_columnc              	   C   s8   d}t jt|d tjd| ddgd W 5 Q R X d S )Nz['usecols' must either be list-like of all strings, all unicode, all integers or a callable.rP   rE   ZE1r   r   r[   r^   r   r   r   test_usecols_wrong_type^  s    z#TestReaders.test_usecols_wrong_typec                 C   s8   t jd| dd}tddggddgd}t|| d S )	NZtest2rR   rU   ZaaaaZbbbbbTestZTest1rf   r5   r4   r   rp   rq   )r9   r   parsedrN   r   r   r   test_excel_stop_iteratorg  s    z$TestReaders.test_excel_stop_iteratorc                 C   sT   |dkr|j tjjdd tjd| dd}ttj	ggdgd}t
|| d S )	Nr   ra   rb   Ztest3rR   r   r   rf   )rk   rl   r    rm   rn   r5   r4   r   npnanrp   rq   )r9   r*   r   r   rN   r   r   r   test_excel_cell_error_nal  s    z$TestReaders.test_excel_cell_error_nac                 C   s   |dkr|j tjjdd tjd| ddd}tjd| dd	gdd
}tj||dd tj||dd tjd| ddd	d}t||j	d d  d S )Nr   ra   rb   rE   rR   r   r   rX   rG   rU   rZ   rV   Fri   rU   rV   
skipfooter)
rk   rl   r    rm   rn   r5   r4   rp   rq   ilocrw   r   r   r   test_excel_tablex  s,          zTestReaders.test_excel_tablec           
      C   sp  |dkr|j tjjdd tdddddgd	d
dddgdddddgdddddgdddddgtdddtdddtdddtdddtdddgd}d}tj	|| d d!}t
|| | }d"|j|jd d#f< tj	|| d d!}t
|| t|jD ]4\}}tj	|| d |d$}||}	t
||	 q |d% t|d%< tj	|| d d%tid&}t
|| d S )'Nr   ra   rb   rG   rh      r   g      ?g      @gHzG?gQ?g&.>TFrS      r   cdei  
         iq        i  )IntColFloatColBoolColStrColStr2ColZDateColZ
test_typesrR   r   g      @r   r   r   rU   
converters)rk   rl   r    rm   rn   r   	from_dictr   r5   r4   rp   rq   copylocr   	enumeraterg   r   applystr)
r9   r*   r   rN   basenameactualZfloat_expectedZicolnameexpr   r   r   test_reader_special_dtypes  sT    




  
  z&TestReaders.test_reader_special_dtypesc              
   C   s   d}t dddddgdtjdd	d
gdddddgdtjdddgd}dd dd dd dd d}tj|| d|d}t|| d S )NZtest_convertersrG   rh   r   r   g      )@gL2@g3333333@g:0y5>Found	Not found1345)r   r   r   r   c                 S   s   | dkrt | S dS )N r   )intr   r   r   r   <lambda>      z4TestReaders.test_reader_converters.<locals>.<lambda>c                 S   s   | rd|  S t jS )Nr   )r   r   r   r   r   r   r     r   c                 S   s   | dkrdS dS )Nr   r   r   r   r   r   r   r   r     r   c                 S   s   | rt | S dS )Nr   )r   r   r   r   r   r     r   )r   r   rh   rS   rR   r   )r   r   r   r   r5   r4   rp   rq   )r9   r   r   rN   r   r   r   r   r   test_reader_converters  s&    
	  z"TestReaders.test_reader_convertersc              	   C   s   d}t || }tddddgdddd	gddddgd
dtjdgdjddddgd}t|| t j|| ddtdd}|d 	d|d< |d 	d|d< ddddg|d< t|| d}t
jt|d t j|| ddid W 5 Q R X d S )N	testdtyperG   rh   rS   r         @      @      @      @      ?       @      @r   r   r   r   r   r   r   r   rf   float64float32)r   r   r   dtype001002003004z(Unable to convert column d to type int64rP   int64)r5   r4   r   r   r   ro   rp   rq   r   Zastyper    r\   r]   )r9   r   r   r   rN   r_   r   r   r   test_reader_dtype  s.    



	 
zTestReaders.test_reader_dtypezdtype,expectedr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   2r   c                 C   s&   d}t j|| |d}t|| d S )Nr   r   r5   r4   rp   rq   )r9   r   r   rN   r   r   r   r   r   test_reader_dtype_str  s    z!TestReaders.test_reader_dtype_strc                    s~  |dkrt d| d ttddgddtdd	gd
dtddgddtddgddttjdgddttjdgd
dttjdgddttjdgddttdgd ttjtjgddd
t|&}j	|ddd tj
|d|d}W 5 Q R X |dkrjdd lddlm  t fddjD } |d jjjdd |d<  d d g|d!< n}t|| d S )"Nr   r   No engine for filetype: ''rG   rS   ZInt64r   r   r   ZFloat64TFbooleanr   r   string   g      @z
2019-12-31rh   )
r   r   r   r   r   rL   ghijtestr   rU   dtype_backendpyarrowr   )ArrowExtensionArrayc                    s$   i | ]}| j | d dqS )T)Zfrom_pandas)array)r%   colr   dfpar   r   
<dictcomp>7  s    z2TestReaders.test_dtype_backend.<locals>.<dictcomp>r   us)unitr   )r    skipr   r   r5   NA	Timestamprp   ensure_cleanto_excelr4   r   Zpandas.arraysr   rg   r   _datacast	timestamprq   )r9   r   r   	file_pathrM   rN   r   r   r   test_dtype_backend  sH      
zTestReaders.test_dtype_backendc              	   C   s|   |dkrt d| d ttjdgdtjgd}t|(}|j|ddd	 tj	|dd
dd}W 5 Q R X t
|| d S )Nr   r   r   r   r   r   r   r   Fr   numpy_nullabler   )rU   r   r   )r    r  r   r   r   rp   r	  r
  r5   r4   rq   )r9   r   r  r  rM   r   r   r   test_dtype_backend_and_dtypeF  s    z(TestReaders.test_dtype_backend_and_dtyper   c              
   C   s  |dkrt d| d dd l}td| ttjddgtjdtjd	tj	gtjdd
}t
|&}|j|ddd tj|ddd}W 5 Q R X |dkrtttjddgtjdttjd	tj	gtjdd
}n*tt|ddgt|d	d gd
}t
|| W 5 Q R X d S )Nr   r   r   r   zmode.string_storager   r   r   r   r  r   Fr   r  r   python)r    r  r   r5   option_contextr   r   r   Zobject_r  rp   r	  r
  r4   r   r   rq   )r9   r   Zstring_storager  r  r  rM   rN   r   r   r   test_dtype_backend_stringV  s8      z%TestReaders.test_dtype_backend_stringzdtypes, exp_valuea.1r   c           	      C   s\   d}dt i|}| }tj|| |d}tdg|gd}||ksLtdt|| d S )NZdf_mangle_dup_col_dtypesr   r   r   )r   r  zdtype dict changed)r   r   r5   r4   r   rJ   rp   rq   )	r9   r   ZdtypesZ	exp_valuer   Z
dtype_dictZdtype_dict_copyrM   rN   r   r   r   test_dtype_mangle_dup_cols{  s    z&TestReaders.test_dtype_mangle_dup_colsc                 C   s8   d}t || }tddddddgi}t|| d S )NZtest_spacesZtestcolzthis is greatz4    spacesz1 trailing z
 1 leadingz2  spaces  multiple  timesr   )r9   r   r   r   rN   r   r   r   test_reader_spaces  s    zTestReaders.test_reader_spaceszbasename,expectedzgh-35802ZCOLUMNzTest (1)zgh-36122z
got 2nd sarf   c                 C   s6   |dkrt d|  t|| }t|| d S )Nr   zSkipped for engine: )r    r  r5   r4   rp   rq   )r9   r   r   r   rN   r   r   r   r   test_read_excel_ods_nested_xml  s    	z*TestReaders.test_read_excel_ods_nested_xmlc                 C   sH   d}t j|| d d}dddg}t||  |t| ksDtd S )Ntest_multisheetr   CharlieAlphaBeta)r5   r4   rp   assert_contains_allkeyslistrJ   r9   r   r   dfsexpected_keysr   r   r   test_reading_all_sheets  s
    
z#TestReaders.test_reading_all_sheetsc                 C   sX   d}dddg}t j|| |d}tt|}t||  t|t| ksTtd S )Nr  rh   r  r   )	r5   r4   r   setrp   r  r  r   rJ   )r9   r   r   r#  r"  r   r   r   %test_reading_multiple_specific_sheets  s    
z1TestReaders.test_reading_multiple_specific_sheetsc                 C   s4   d}t j|| d d}dddg}t||  d S )Nblank_with_headerr   rR   rX   r   )r5   r4   rp   r  r  r!  r   r   r   "test_reading_all_sheets_with_blank  s    
z.TestReaders.test_reading_all_sheets_with_blankc                 C   s$   t jd| dd}t|t  d S )NblankrR   r   )r5   r4   rp   rq   r   )r9   r   r   r   r   r   test_read_excel_blank  s    z!TestReaders.test_read_excel_blankc                 C   s0   t ddgd}tjd| dd}t|| d S )NZcol_1Zcol_2rf   r'  rR   r   )r   r5   r4   rp   rq   )r9   r   rN   r   r   r   r   !test_read_excel_blank_with_header  s    z-TestReaders.test_read_excel_blank_with_headerc              	   C   sf   t jtdd tjd| dgd d W 5 Q R X t jtdd tjd| dd d d	 W 5 Q R X d S )
Nz \(sheet: Sheet1\)$rP   r'  rG   )headerrU   rE   c                 S   s   dd S )NrG   r   r   r   r   r   r   r     r   zHTestReaders.test_exception_message_includes_sheet_name.<locals>.<lambda>)rW   rU   )r    r\   r]   r5   r4   ZeroDivisionErrorr9   r   r   r   r   *test_exception_message_includes_sheet_name  s     z6TestReaders.test_exception_message_includes_sheet_namez-ignore:Cell A4 is marked:UserWarning:openpyxlc                 C   s   |dkr|j tjjdd ttddgtddgdd	ggd
dgd}|dkrj|j tjjdd |d kr|dkr|j tjjdd td| }t	
|| d S )Nr   ra   rb   z
2016-03-12zMarc Johnsonz
2016-03-16z
Jack Blackg@xDzTimothy BrownZDateColWithBigIntZ	StringColrf   r   zMaybe not supported by openpyxl)r   r   z)Defaults to openpyxl, maybe not supportedZtestdateoverflow)rk   rl   r    rm   rn   r   r5   r  r4   rp   rq   )r9   r*   r   r   rN   rM   r   r   r   test_date_conversion_overflow  s.    	z)TestReaders.test_date_conversion_overflowc                 C   sr   |dkr|j tjjdd d}d}tj|| |dd}tj|| d|d}tj||d	d
 tj||d	d
 d S Nr   ra   rb   rE   rR   r   r   )rV   rU   Fri   rz   )r9   r*   r   rr   filenamerU   rs   rt   r   r   r   test_sheet_name  s       zTestReaders.test_sheet_namec              	   C   sN   d| }t j|ddd}t|d"}t j|ddd}t|| W 5 Q R X d S )NrE   rR   r   r   rF   )r5   r4   rI   rp   rq   )r9   r   pthrN   rL   r   r   r   r   test_excel_read_buffer  s
    z"TestReaders.test_excel_read_bufferc              	   C   s0   d}t jtdd tjd|d W 5 Q R X d S )NfoozUnknown engine: foorP   r   r0   r[   )r9   Z
bad_enginer   r   r   test_bad_engine_raises  s    z"TestReaders.test_bad_engine_raisesrU   r   rR   c              	   C   s4   d}t jt|d tjd| |d W 5 Q R X d S Nz?Worksheet index 3 is invalid|Worksheet named 'Sheet4' not foundrP   r)  r   r[   )r9   r   rU   r_   r   r   r   test_bad_sheetname_raises  s    z%TestReaders.test_bad_sheetname_raisesc              	   C   s6   d| }d}t jt|d t| W 5 Q R X d S )Nr6  uV   (No such file or directory|没有那个文件或目录|File o directory non esistente)rP   )r    r\   FileNotFoundErrorr5   r4   )r9   r   Zbad_filerQ   r   r   r   test_missing_file_raises'  s    
z$TestReaders.test_missing_file_raisesc              	   C   sd   d}|d krt }d}n&|dkr4ddlm} |}d}nt}d}tj||d t| W 5 Q R X d S )	Ns   foozLExcel file format cannot be determined, you must specify an engine manually.r   r   )	XLRDErrorzFUnsupported format, or corrupt file: Expected BOF record; found b'foo'zFile is not a zip filerP   )r]   r   r<  r   r    r\   r5   r4   )r9   r   Z
bad_streamerrorr_   r<  r   r   r   test_corrupt_bytes_raises.  s    z%TestReaders.test_corrupt_bytes_raisesz^https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/excel/test1.xlsx)urlZcheck_before_testc                 C   s0   d| }t |}t d| }t|| d S )NzYhttps://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/excel/test1rE   r   )r9   r   r?  	url_tablelocal_tabler   r   r   test_read_from_http_urlD  s    

z#TestReaders.test_read_from_http_urlc              	   C   sf   t d| d}|djd| |d W 5 Q R X d| }tj||d}td| }t|| d S )NrE   rF   pandas-testZKeyZBodys3://pandas-test/test1)Zstorage_options)rI   Bucket
put_objectr5   r4   rp   rq   )r9   r   s3_resources3sorL   r?  r@  rA  r   r   r   test_read_from_s3_urlU  s    "z!TestReaders.test_read_from_s3_urlc           	   	   C   s   t d| d}|djd| |d W 5 Q R X dd l}|jf |}| d| }t|}W 5 Q R X td| }t|| d S )NrE   rF   rC  rD  r   rE  )	rI   rF  rG  s3fsZS3FileSystemr5   r4   rp   rq   )	r9   r   rH  rI  rL   rK  Zs3r@  rA  r   r   r   test_read_from_s3_objectb  s    "z$TestReaders.test_read_from_s3_objectc                 C   s~   t j|dddd| }t|}ztd| }W n6 tk
rl   dt  }t	
d|  Y nX t|| d S )Nr1   r2   r3   rE   zfile://localhost/ zfailing on )ospathjoinr5   r4   r   platformunamestripr    r  rp   rq   )r9   r   r:   Z
localtablerA  r@  Zplatform_infor   r   r   test_read_from_file_urls  s    
z#TestReaders.test_read_from_file_urlc                 C   sD   d| }t j|ddd}td| }t j|ddd}t|| d S )NrE   rR   r   r   )r5   r4   r   rp   rq   )r9   r   str_pathrN   path_objr   r   r   r   test_read_from_pathlib_path  s
    z'TestReaders.test_read_from_pathlib_pathzpy.pathc                 C   s\   ddl m} tjd| }tj|ddd}| d| }tj|ddd}t|| d S )Nr   )localrE   rR   r   )	Zpy.pathrX  rN  rO  rP  r5   r4   rp   rq   )r9   r   Z	LocalPathrU  rN   rV  r   r   r   r   test_read_from_py_localpath  s    z'TestReaders.test_read_from_py_localpathc              	   C   sD   t jd| }t|d }tj|ddd}~|  W 5 Q R X d S )NrE   rF   rR   r   r   )rN  rO  rP  rI   r5   r4   read)r9   r   rU  rL   r   r   r   r   test_close_from_py_localpath  s
    z(TestReaders.test_close_from_py_localpathc                 C   s   |dkr|j tjjdd tdtdddtddd	d
tddddtddddtddddtddddtddddtdddd tdd!dd"td#d$d%d&td'd(d)gi}tj	d*| d+d,}t
|| tj	d-| d+d,}t
|| d S ).Nr   ra   rb   ZTimerG   rh   rS   -   8   i r      1   i@ r      *   i    9   #   i 	   )      i           i'	 r   i`
 5   i 5    %   r   i       6   Z
times_1900rR   r   Z
times_1904)rk   rl   r    rm   rn   r   r   r   r5   r4   rp   rq   )r9   r*   r   r   rN   r   r   r   r   test_reader_seconds  s4    

zTestReaders.test_reader_secondsc              	   C   sB  |dkr|j tjjdd tddgddgg}d| }td	d
t	ddgddt	ddgddt	ddgddt	ddgg|d}tj
|ddd	gdd}t|| ||_ddddg|_tj
|ddd	gd}tj||dd ||_tj
|d dd	gdd	gd!}tj||dd ddddg|_|d"d#g|_tj
|d$dd	gd}t|| ttd|_|d%d&g|_tj
|d'dd	gdd}t|| |jd	dgd	d(d%d&g|_tj
|d)ddd	gd!}t|| |d%d&g|_|d"d#g|_tj
|d*dd	gdd	gd!}t|| tj
|d+dd	gdd	gdd,}t|| d S )-Nr   ra   rb   r6  barr   r   testmultiindexrG   r   
2015-01-01Trh   r   
2015-01-02FrS   r   
2015-01-03r   r   
2015-01-04rf   	mi_columnr   )rU   r,  rV   r   r   mi_indexr   ri   bothrU   rV   r,  ilvl1ilvl2Zmi_index_namec1c2mi_column_name)levelZname_with_intZ	both_nameZboth_name_skiprows)rU   rV   r,  rZ   )rk   rl   r    rm   rn   r
   from_productr   r5   r  r4   rp   rq   r   rg   Z	set_namesr   r~   Z
set_levels)r9   r*   r   mimi_filerN   r   r   r   r   test_read_excel_multiindex  s    
               z&TestReaders.test_read_excel_multiindexzsheet_name,idx_lvl2Zboth_name_blank_after_mi_namer   r   Zboth_name_multiple_blanksc           	   	   C   s   |dkr|j tjjdd d| }tjddgddggd	d
gd}tddt	ddgddt	ddgddt	ddgddt	ddgg|tj
ddddg|fddgdd}tj||ddgddgd}t|| d S )Nr   z;Sheets containing datetimes not supported by pyxlsb (GH4679rb   rs  r6  rr  r   r   r~  r  r   rG   r   rt  Trh   r   ru  FrS   r   rv  r   r   rw  r|  r}  r   r   r{  )rk   rl   r    rm   rn   r
   r  r   r5   r  Zfrom_arraysr4   rp   rq   )	r9   r*   r   rU   Zidx_lvl2r  r  rN   rM   r   r   r   +test_read_excel_multiindex_blank_after_name  s6    z7TestReaders.test_read_excel_multiindex_blank_after_namec                 C   sT   d| }t j|dddgd}tddg}tddd	d
ggd |d}t|| d S )Nrs  index_col_noner   rG   rU   r,  rv   rd   keyvalrh   rS   r   rf   )r5   r4   r
   r  r   rp   rq   )r9   r   r  rM   Zexp_columnsrN   r   r   r   &test_read_excel_multiindex_header_onlyB  s
    z2TestReaders.test_read_excel_multiindex_header_onlyc           	      C   s  d| }t d d d d d gdddddgddd	d
dgdddddgdddddgdddddgg}dddddg}td d!d"d#d$d%gd&d'd(d)d*d+ggd,d-d.d/d0d1gd,d-d.d/d0d1ggd d gd2}td d!d"d#d$d%gd d3}t|||d4}tj|d5d,d6}t|| ||_	tj|d7d,d-gd6}t|| t dddddgddd	d
dgdddddgdddddgdddddgg}dddddg}td!d"d#d$d%gd'd(d)d*d+ggd,d-d.d/d0gd,d-d.d/d0ggd d gd2}td!d"d#d$d%gd d3}t|||d4}tj|d8d,d6}t|| ||_	tj|d9d,d-gd6}tj||d:d; d S )<NZtest_index_name_pre17ZR0C0ZR0C1ZR0C2ZR0C3ZR0C4ZR1C0ZR1C1ZR1C2ZR1C3ZR1C4ZR2C0ZR2C1ZR2C2ZR2C3ZR2C4ZR3C0ZR3C1ZR3C2ZR3C3ZR3C4ZR4C0ZR4C1ZR4C2ZR4C3ZR4C4ZC_l0_g0ZC_l0_g1ZC_l0_g2ZC_l0_g3ZC_l0_g4ZR0ZR_l0_g0ZR_l0_g1ZR_l0_g2ZR_l0_g3ZR_l0_g4ZR1ZR_l1_g0ZR_l1_g1ZR_l1_g2ZR_l1_g3ZR_l1_g4r   rG   rh   rS   r   r   r   r   r   rg   Zsingle_namesr   Zmulti_namesZsingle_no_namesZmulti_no_namesFri   )
r   r   r
   r	   r   r5   r4   rp   rq   r   )	r9   r   r2  r2   rg   r  sirN   r   r   r   r   test_excel_old_index_formatM  sf    
 	z'TestReaders.test_excel_old_index_formatc              
   C   s>   d}dD ]0}t jt|d tjd| |d W 5 Q R X qd S )Nz#Passing a bool to header is invalid)TFrP   rE   r,  r   )r9   r   r_   argr   r   r   test_read_excel_bool_header_arg  s    z+TestReaders.test_read_excel_bool_header_argc              	   C   sV  |dkr|j tjjdd tjd| dddgd}td	d
tddgddtddgddtddgddtddggddddgd}t	
|| tjd| dtddgd}t	
|| tjd| ddd d}t	
|| tjd| ddddddgd}tddtddgddtddgddtddggddddgd}t	
|| d S )Nr   ra   rb   testskiprowsskiprows_listr   rh   rU   rZ   rG   r   rt  Tr   ru  FrS   r   rv  r   r   rw  r   r   r   r   rf   c                 S   s   | dkS N)r   rh   r   r   r   r   r   r     r   z6TestReaders.test_read_excel_skiprows.<locals>.<lambda>)rU   rZ   r   )rk   rl   r    rm   rn   r5   r4   r   r  rp   rq   r   r   r9   r*   r   r   rN   r   r   r   test_read_excel_skiprows  s\      
	

	z$TestReaders.test_read_excel_skiprowsc                 C   sz   |dkr|j tjjdd tjd| ddd d}td	d
tddgddtddggddddgd}t	
|| d S )Nr   ra   rb   r  r  c                 S   s   | dkS )N)rG   rS   r   r   r   r   r   r   r     r   zFTestReaders.test_read_excel_skiprows_callable_not_in.<locals>.<lambda>r  rG   r   rt  TrS   r   rv  Fr   r   r   r   rf   )rk   rl   r    rm   rn   r5   r4   r   r  rp   rq   r  r   r   r   (test_read_excel_skiprows_callable_not_in  s$    
	z4TestReaders.test_read_excel_skiprows_callable_not_inc                 C   s@   d}t jd| |d}t d| }|d | }t|| d S )Nr   rE   nrowsr   )r9   r   num_rows_to_pullr   rN   r   r   r   test_read_excel_nrows  s
    z!TestReaders.test_read_excel_nrowsc                 C   s@   t d| }t|}|d }t jd| |d}t|| d S )NrE   r   r  )r5   r4   r   rp   rq   )r9   r   rN   Znum_records_in_filer  r   r   r   r   0test_read_excel_nrows_greater_than_nrows_in_file  s
    z<TestReaders.test_read_excel_nrows_greater_than_nrows_in_filec              	   C   s4   d}t jt|d tjd| dd W 5 Q R X d S )Nz'nrows' must be an integer >=0rP   rE   r   r  r[   r^   r   r   r   +test_read_excel_nrows_non_integer_parameter  s    z7TestReaders.test_read_excel_nrows_non_integer_parameterz-filename,sheet_name,header,index_col,skiprowsrs  rx  ry  rz  r  r  r  c                 C   s   | dkS r  r   r   r   r   r   r   
  r   zTestReaders.<lambda>c           	      C   sL   t j|| ||||djdd }t j|| ||||dd}t|| dS )z
        For various parameters, we should get the same result whether we
        limit the rows during load (nrows=3) or after (df.iloc[:3]).
        )rU   r,  rV   rZ   NrS   )rU   r,  rV   rZ   r  )r5   r4   r   rp   rq   )	r9   r   r2  rU   r,  rV   rZ   rN   r   r   r   r   test_read_excel_nrows_params  s$    z(TestReaders.test_read_excel_nrows_paramsc              	   C   s0   t jtdd td| dd W 5 Q R X d S )Nzbut 3 positional argumentsrP   rE   rR   r   r   r.  r   r   r   test_deprecated_kwargs&  s    z"TestReaders.test_deprecated_kwargsc                 C   s^   d| }ddddg}t jddddgdd}t||d	d
}tj|dddgd d}t|| d S )Nrs  )rd   rd   r  )rS   r   )rv   rv   )rG   rh   )r   rG   r  )rh   rS   r  r  r   rG   r{  )r
   from_tuplesr   r5   r4   rp   rq   )r9   r   	file_namer2   idxrN   rM   r   r   r   "test_no_header_with_list_index_col*  s    
    z.TestReaders.test_no_header_with_list_index_colc                 C   s>   d| }dt jddg}t|dgd}t|}t|| d S )NZone_col_blank_lineg      ?rG   rh   Znumbersrf   )r   r   r   r5   r4   rp   rq   )r9   r   r  r2   rN   rM   r   r   r   test_one_col_noskip_blank_line7  s
    
z*TestReaders.test_one_col_noskip_blank_linec                 C   sj   d| }t ddg}tjtjgtjtjgddgddgg}t||d}tj|d	d
dgd}t|| d S )Nrs  )r   rv   )r   rd   rG   rS   rh   r   rf   Zmi_column_empty_rowsr   r  )	r
   r  r   r   r   r5   r4   rp   rq   )r9   r   r  rg   r2   rN   rM   r   r   r    test_multiheader_two_blank_lines?  s    $  z,TestReaders.test_multiheader_two_blank_linesc                 C   s$   d| }t |}|jdks tdS )z
        Sheets can contain blank cells with no data. Some of our readers
        were including those cells, creating many empty rows and columns
        Ztrailing_blanks)rS   rS   N)r5   r4   shaperJ   )r9   r   r  rM   r   r   r   test_trailing_blanksJ  s    
z TestReaders.test_trailing_blanksc              	   C   s`   |dkrt d |dkr0|jt jjdd t jtdd tj	d| d	d
 W 5 Q R X d S )Nr   *chartsheets do not exist in the ODF formatr   4pyxlsb can't distinguish chartsheets from worksheetsrb   z"Worksheet named 'Chart1' not foundrP   
chartsheetZChart1r   
r    r  rk   rl   rm   rn   r\   r]   r5   r4   r9   r*   r   r   r   r   r   test_ignore_chartsheets_by_strS  s    
z*TestReaders.test_ignore_chartsheets_by_strc              	   C   s`   |dkrt d |dkr0|jt jjdd t jtdd tj	d| d	d
 W 5 Q R X d S )Nr   r  r   r  rb   z0Worksheet index 1 is invalid, 1 worksheets foundrP   r  rG   r   r  r  r   r   r   test_ignore_chartsheets_by_int`  s    
 z*TestReaders.test_ignore_chartsheets_by_intc              	   C   sf   t jd| ddd}tdddddd	gd
dddddgddddddggddddddgd}t|| d S )NZtest_decimal,rG   )decimalrZ   gAc̝ė@g	hAABCZpoig2[j@rh   gHzG^@g{G@ZDEFZuytgUq&?rS   g%Cq@g^@ZGHIZrezg)@ZIdZNumber1ZNumber2ZText1ZText2ZNumber3rf   r   r   r   r   r   test_euro_decimal_formato  s    z$TestReaders.test_euro_decimal_format)X__name__
__module____qualname__r    fixturer=   rO   r`   ru   ry   rm   parametrizer{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  td
skip_if_nor  r  r  r  r$  r&  r(  r*  r+  r/  filterwarningsr0  r3  r5  r7  r9  r;  r>  networkrp   rB  Zskip_if_not_us_localeZ
single_cpurJ  rL  ZslowrT  rW  rY  r[  rq  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r.   u   s  

5 2


		3




-
$




 
	



	!V
"H7
	r.   c                
   @   s   e Zd Zejdddd Zdd Zdd Zej	d	d
ddgdd Z
dd Zdd Zej	ddddgddgdddgddggdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zej	d%d&d'gd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd
S )2TestExcelFileReadTr/   c                 C   s2   t tj|d}||ddd |td| dS )zH
        Change directory and set engine for ExcelFile objects.
        r0   r1   r2   r3   rH   N)r   r5   rH   r6   r7   r8   r   r   r   r=   ~  s    z#TestExcelFileRead.cd_and_set_enginec              	   C   s^   dddddd}t d| }|j}W 5 Q R X |d k	r>|}n||dd   }||ksZtd S )Nr   r   r   r   rB   rE   rG   )r5   rH   r   rJ   )r9   r   r   rK   r3   rM   rN   r   r   r   rO     s    z"TestExcelFileRead.test_engine_usedc              	   C   s  t d| }t j|dddgd}W 5 Q R X tdgdgdgtjgdggd	gd
}t|| t d| }t j|dddgd}W 5 Q R X ttjgdgtjgtjgdggd	gd
}t|| t d| }t j|dddgd}W 5 Q R X tdgdgdgtjgdggd	gd
}t|| t d| }t j|dddgd}W 5 Q R X ttjgdgtjgtjgdggd	gd
}t|| d S )NZtest4rR   FapplerU   Zkeep_default_naZ	na_valuesr  rG   rabbitr   rf   Ttest51.#QNANr   )r5   rH   r4   r   r   r   rp   rq   )r9   r   r3   r   rN   r   r   r   test_excel_passes_na  s`                    z&TestExcelFileRead.test_excel_passes_na	na_filterNFc              	   C   s   i }|d k	r||d< t d| "}t j|fdddgd|}W 5 Q R X |dkrldgd	gd
gdgdgg}ntjgd	gtjgtjgdgg}t|dgd}t|| d S )Nr  r  rR   Tr  r  Fr  rG   r   r  r   rf   )r5   rH   r4   r   r   r   rp   rq   )r9   r   r  r?   r3   r   rN   r   r   r   test_excel_passes_na_filter  s$    z-TestExcelFileRead.test_excel_passes_na_filterc              	   C   s\  |dkr|j tjjdd td| *}tj|ddd}tj|ddgdd}W 5 Q R X tj	||d	d
 tj	||d	d
 td| &}|j
ddd}|j
ddgdd}W 5 Q R X tj	||d	d
 tj	||d	d
 td| }tj|dddd}W 5 Q R X t	||jd d  td| }|j
dddd}W 5 Q R X t	||jd d  d S )Nr   ra   rb   rE   r   r   rG   r   Fri   )rV   )rZ   rV   r   r   )rV   r   )rk   rl   r    rm   rn   r5   rH   r4   rp   rq   rA   r   )r9   r*   r   rr   r3   rs   rt   rx   r   r   r   test_excel_table_sheet_by_index  s,    z1TestExcelFileRead.test_excel_table_sheet_by_indexc           	   	   C   s   |dkr|j tjjdd d}d}t|| }|j|dd}W 5 Q R X t|| }|jd|d}W 5 Q R X tj	||d	d
 tj	||d	d
 d S r1  )
rk   rl   r    rm   rn   r5   rH   rA   rp   rq   )	r9   r*   r   rr   r2  rU   r3   Z	df1_parseZ	df2_parser   r   r   r3    s    z!TestExcelFileRead.test_sheet_namerU   rS   r   r   rR   c              
   C   sH   d}t jt|d, td| }|j|d W 5 Q R X W 5 Q R X d S r8  )r    r\   r]   r5   rH   rA   )r9   r   rU   r_   r3   r   r   r   r9  	  s    z+TestExcelFileRead.test_bad_sheetname_raisesc              
   C   sf   d| }t j|dd|d}t|d,}t |}t j|ddd}W 5 Q R X W 5 Q R X t|| d S )NrE   rR   r   rU   rV   r   rF   r   )r5   r4   rI   rH   rp   rq   )r9   r   r   r4  rN   rL   rD   r   r   r   r   r5    s    $z(TestExcelFileRead.test_excel_read_bufferc              
   C   sP   t d| d.}t|}tj|dd|d W 5 Q R X W 5 Q R X |jsLtd S )NrE   rF   rR   r   r  )rI   r5   rH   r4   closedrJ   )r9   r   r   rL   rC   r   r   r   test_reader_closes_file  s    &z)TestExcelFileRead.test_reader_closes_filec              
   C   sJ   d}t d| .}tjt|d t j|dd W 5 Q R X W 5 Q R X d S )Nz8Engine should not be specified when passing an ExcelFilerE   rP   r6  r0   )r5   rH   r    r\   r]   r4   )r9   r   r_   Zxlr   r   r   test_conflicting_excel_engines&  s    z0TestExcelFileRead.test_conflicting_excel_enginesc              	   C   sR   t jd| |d}td| d}| }W 5 Q R X t j||d}t|| d S )NrE   r0   rF   )r5   r4   rI   rZ  rp   rq   )r9   r   r   rN   rL   r2   r   r   r   r   test_excel_read_binary.  s
    z(TestExcelFileRead.test_excel_read_binaryc              	   C   sF   t d| d}t|}W 5 Q R X tjd| |d}t|| d S )NrE   rF   r0   )rI   r5   r4   rp   rq   )r9   r   r   rL   rM   rN   r   r   r   %test_excel_read_binary_via_read_excel8  s    z7TestExcelFileRead.test_excel_read_binary_via_read_excelc              
   C   sF   t dd2}tjtdd tj|ddgd W 5 Q R X W 5 Q R X d S )Nzdf_header_oob.xlsxrF   zexceeds maximumrP   r   rG   r  )rI   r    r\   r]   r5   r4   )r9   r   rL   r   r   r   )test_read_excel_header_index_out_of_range?  s    z;TestExcelFileRead.test_read_excel_header_index_out_of_ranger2  zdf_empty.xlsxzdf_equals.xlsxc                 C   s`   t dgdd}tjddgddgd}td	d
gg||dd}tj|dddd	gd}t|| d S )NZZI2r  r  )rv   zB.1ZI11ZI12r  rG   rS   r   )r   rg   r   rR   r   r{  )r	   r
   r  r   r5   r4   rp   rq   )r9   r2  r  colsrN   rM   r   r   r   test_header_with_index_colE  s       z,TestExcelFileRead.test_header_with_index_colc           	   	   C   s   |dkr|j tjjdd d| }t|}tj|ddgd|d}W 5 Q R X tj	t
dt
d	fgt
d t
d	 gd
}tg g |d}t|| d S )Nr   ra   rb   Ztest_datetime_mir   rG   )r,  rV   r   z
02/29/2020z
03/01/2020r  r  )rk   rl   r    rm   rn   r5   rH   r4   r
   r  Zto_datetimeZto_pydatetimer   rp   rq   )	r9   r*   r   r   rL   r3   r   Zexpected_column_indexrN   r   r   r   test_read_datetime_multiindexP  s"     z/TestExcelFileRead.test_read_datetime_multiindexc              
   C   s>   t jtdd& td| dd W 5 Q R X W 5 Q R X d S )NzValue must be one of *rP   zio.excelz.readerabc)r    r\   r]   r5   r  r.  r   r   r   test_engine_invalid_optiong  s    z,TestExcelFileRead.test_engine_invalid_optionc              	   C   s^   |dkrt d |dkr0|jt jjdd td| }|jdgksPt	W 5 Q R X d S )Nr   r  r   r  rb   r  rR   )
r    r  rk   rl   rm   rn   r5   rH   Zsheet_namesrJ   )r9   r*   r   r   r3   r   r   r   test_ignore_chartsheetsm  s    
z)TestExcelFileRead.test_ignore_chartsheetsc              
   C   s   t f}|d kr td|  n|dkr<dd l}t |jjf}td| R}t|	d t
d. ztj||d W n |k
r   Y nX W 5 Q R X W 5 Q R X d S )NzInvalid test for engine=r   r   ZcorruptFr0   )r   r    r  r   Zbiffhr<  rp   r	  r   
write_textZassert_produces_warningr5   rH   )r9   r   r   errorsr   filer   r   r   test_corrupt_files_closedz  s    z+TestExcelFileRead.test_corrupt_files_closed)r  r  r  r    r  r=   rO   r  rm   r  r  r  r3  r9  r5  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  }  s2   

&





r  )-r   r   	functoolsr   rN  pathlibr   rQ  urllib.errorr   zipfiler   Znumpyr   r    Zpandas.util._test_decoratorsutilZ_test_decoratorsr  Zpandasr5   r   r	   r
   r   Zpandas._testingZ_testingrp   Zpandas.core.arraysr   r   r$   r!   r  Zengine_paramsr   boolr   r#   r  r+   r   r   r.   r  r   r   r   r   <module>   sr   
	


          