@@ -152,6 +152,9 @@ def _is_url(url):
152
152
def _read (cls , filepath_or_buffer , kwds ):
153
153
"Generic reader of line files."
154
154
encoding = kwds .get ('encoding' , None )
155
+ skipfooter = kwds .pop ('skipfooter' , None )
156
+ if skipfooter is not None :
157
+ kwds ['skip_footer' ] = skipfooter
155
158
156
159
if isinstance (filepath_or_buffer , str ) and _is_url (filepath_or_buffer ):
157
160
from urllib2 import urlopen
@@ -218,28 +221,31 @@ def read_csv(filepath_or_buffer,
218
221
verbose = False ,
219
222
delimiter = None ,
220
223
encoding = None ,
221
- squeeze = False ):
222
- kwds = dict (filepath_or_buffer = filepath_or_buffer ,
223
- sep = sep , dialect = dialect ,
224
- header = header , index_col = index_col ,
225
- names = names , skiprows = skiprows ,
226
- na_values = na_values , keep_default_na = keep_default_na ,
227
- thousands = thousands ,
228
- comment = comment , parse_dates = parse_dates ,
229
- keep_date_col = keep_date_col ,
230
- dayfirst = dayfirst , date_parser = date_parser ,
231
- nrows = nrows , iterator = iterator ,
232
- chunksize = chunksize , skip_footer = skip_footer ,
233
- converters = converters , verbose = verbose ,
234
- delimiter = delimiter , encoding = encoding ,
235
- squeeze = squeeze )
224
+ squeeze = False ,
225
+ ** kwds ):
226
+ kdict = dict (filepath_or_buffer = filepath_or_buffer ,
227
+ sep = sep , dialect = dialect ,
228
+ header = header , index_col = index_col ,
229
+ names = names , skiprows = skiprows ,
230
+ na_values = na_values , keep_default_na = keep_default_na ,
231
+ thousands = thousands ,
232
+ comment = comment , parse_dates = parse_dates ,
233
+ keep_date_col = keep_date_col ,
234
+ dayfirst = dayfirst , date_parser = date_parser ,
235
+ nrows = nrows , iterator = iterator ,
236
+ chunksize = chunksize , skip_footer = skip_footer ,
237
+ converters = converters , verbose = verbose ,
238
+ delimiter = delimiter , encoding = encoding ,
239
+ squeeze = squeeze )
240
+
241
+ kdict .update (kwds )
236
242
237
243
# Alias sep -> delimiter.
238
- sep = kwds .pop ('sep' )
239
- if kwds .get ('delimiter' , None ) is None :
240
- kwds ['delimiter' ] = sep
244
+ sep = kdict .pop ('sep' )
245
+ if kdict .get ('delimiter' , None ) is None :
246
+ kdict ['delimiter' ] = sep
241
247
242
- return _read (TextParser , filepath_or_buffer , kwds )
248
+ return _read (TextParser , filepath_or_buffer , kdict )
243
249
244
250
@Appender (_read_table_doc )
245
251
def read_table (filepath_or_buffer ,
@@ -265,31 +271,34 @@ def read_table(filepath_or_buffer,
265
271
verbose = False ,
266
272
delimiter = None ,
267
273
encoding = None ,
268
- squeeze = False ):
269
- kwds = dict (filepath_or_buffer = filepath_or_buffer ,
270
- sep = sep , dialect = dialect ,
271
- header = header , index_col = index_col ,
272
- names = names , skiprows = skiprows ,
273
- na_values = na_values , keep_default_na = keep_default_na ,
274
- thousands = thousands ,
275
- comment = comment , parse_dates = parse_dates ,
276
- keep_date_col = keep_date_col ,
277
- dayfirst = dayfirst , date_parser = date_parser ,
278
- nrows = nrows , iterator = iterator ,
279
- chunksize = chunksize , skip_footer = skip_footer ,
280
- converters = converters , verbose = verbose ,
281
- delimiter = delimiter , encoding = encoding ,
282
- squeeze = squeeze )
274
+ squeeze = False ,
275
+ ** kwds ):
276
+ kdict = dict (filepath_or_buffer = filepath_or_buffer ,
277
+ sep = sep , dialect = dialect ,
278
+ header = header , index_col = index_col ,
279
+ names = names , skiprows = skiprows ,
280
+ na_values = na_values , keep_default_na = keep_default_na ,
281
+ thousands = thousands ,
282
+ comment = comment , parse_dates = parse_dates ,
283
+ keep_date_col = keep_date_col ,
284
+ dayfirst = dayfirst , date_parser = date_parser ,
285
+ nrows = nrows , iterator = iterator ,
286
+ chunksize = chunksize , skip_footer = skip_footer ,
287
+ converters = converters , verbose = verbose ,
288
+ delimiter = delimiter , encoding = encoding ,
289
+ squeeze = squeeze )
290
+
291
+ kdict .update (kwds )
283
292
284
293
# Alias sep -> delimiter.
285
- sep = kwds .pop ('sep' )
286
- if kwds .get ('delimiter' , None ) is None :
287
- kwds ['delimiter' ] = sep
294
+ sep = kdict .pop ('sep' )
295
+ if kdict .get ('delimiter' , None ) is None :
296
+ kdict ['delimiter' ] = sep
288
297
289
298
# Override as default encoding.
290
- kwds ['encoding' ] = None
299
+ kdict ['encoding' ] = None
291
300
292
- return _read (TextParser , filepath_or_buffer , kwds )
301
+ return _read (TextParser , filepath_or_buffer , kdict )
293
302
294
303
@Appender (_read_fwf_doc )
295
304
def read_fwf (filepath_or_buffer ,
@@ -315,8 +324,9 @@ def read_fwf(filepath_or_buffer,
315
324
delimiter = None ,
316
325
verbose = False ,
317
326
encoding = None ,
318
- squeeze = False ):
319
- kwds = dict (filepath_or_buffer = filepath_or_buffer ,
327
+ squeeze = False ,
328
+ ** kwds ):
329
+ kdict = dict (filepath_or_buffer = filepath_or_buffer ,
320
330
colspecs = colspecs , widths = widths ,
321
331
header = header , index_col = index_col ,
322
332
names = names , skiprows = skiprows ,
@@ -331,9 +341,11 @@ def read_fwf(filepath_or_buffer,
331
341
delimiter = delimiter , encoding = encoding ,
332
342
squeeze = squeeze )
333
343
344
+ kdict .update (kwds )
345
+
334
346
# Check input arguments.
335
- colspecs = kwds .get ('colspecs' , None )
336
- widths = kwds .pop ('widths' , None )
347
+ colspecs = kdict .get ('colspecs' , None )
348
+ widths = kdict .pop ('widths' , None )
337
349
if bool (colspecs is None ) == bool (widths is None ):
338
350
raise ValueError ("You must specify only one of 'widths' and "
339
351
"'colspecs'" )
@@ -344,10 +356,10 @@ def read_fwf(filepath_or_buffer,
344
356
for w in widths :
345
357
colspecs .append ( (col , col + w ) )
346
358
col += w
347
- kwds ['colspecs' ] = colspecs
359
+ kdict ['colspecs' ] = colspecs
348
360
349
- kwds ['thousands' ] = thousands
350
- return _read (FixedWidthFieldParser , filepath_or_buffer , kwds )
361
+ kdict ['thousands' ] = thousands
362
+ return _read (FixedWidthFieldParser , filepath_or_buffer , kdict )
351
363
352
364
def read_clipboard (** kwargs ): # pragma: no cover
353
365
"""
@@ -1276,9 +1288,10 @@ def __init__(self, path_or_buf):
1276
1288
def __repr__ (self ):
1277
1289
return object .__repr__ (self )
1278
1290
1279
- def parse (self , sheetname , header = 0 , skiprows = None , index_col = None ,
1280
- parse_cols = None , parse_dates = False , date_parser = None ,
1281
- na_values = None , thousands = None , chunksize = None ):
1291
+ def parse (self , sheetname , header = 0 , skiprows = None , skip_footer = 0 ,
1292
+ index_col = None , parse_cols = None , parse_dates = False ,
1293
+ date_parser = None , na_values = None , thousands = None , chunksize = None ,
1294
+ ** kwds ):
1282
1295
"""
1283
1296
Read Excel table into DataFrame
1284
1297
@@ -1289,7 +1302,9 @@ def parse(self, sheetname, header=0, skiprows=None, index_col=None,
1289
1302
header : int, default 0
1290
1303
Row to use for the column labels of the parsed DataFrame
1291
1304
skiprows : list-like
1292
- Row numbers to skip (0-indexed)
1305
+ Rows to skip at the beginning (0-indexed)
1306
+ skip_footer : int, default 0
1307
+ Rows at the end to skip (0-indexed)
1293
1308
index_col : int, default None
1294
1309
Column to use as the row labels of the DataFrame. Pass None if
1295
1310
there is no such column
@@ -1304,6 +1319,10 @@ def parse(self, sheetname, header=0, skiprows=None, index_col=None,
1304
1319
-------
1305
1320
parsed : DataFrame
1306
1321
"""
1322
+ skipfooter = kwds .pop ('skipfooter' , None )
1323
+ if skipfooter is not None :
1324
+ skip_footer = skipfooter
1325
+
1307
1326
choose = {True :self ._parse_xlsx ,
1308
1327
False :self ._parse_xls }
1309
1328
return choose [self .use_xlsx ](sheetname , header = header ,
@@ -1313,15 +1332,17 @@ def parse(self, sheetname, header=0, skiprows=None, index_col=None,
1313
1332
date_parser = date_parser ,
1314
1333
na_values = na_values ,
1315
1334
thousands = thousands ,
1316
- chunksize = chunksize )
1335
+ chunksize = chunksize ,
1336
+ skip_footer = skip_footer )
1317
1337
1318
1338
def _should_parse (self , i , parse_cols ):
1319
1339
if isinstance (parse_cols , int ):
1320
1340
return i <= parse_cols
1321
1341
else :
1322
1342
return i in parse_cols
1323
1343
1324
- def _parse_xlsx (self , sheetname , header = 0 , skiprows = None , index_col = None ,
1344
+ def _parse_xlsx (self , sheetname , header = 0 , skiprows = None ,
1345
+ skip_footer = 0 , index_col = None ,
1325
1346
parse_cols = None , parse_dates = False , date_parser = None ,
1326
1347
na_values = None , thousands = None , chunksize = None ):
1327
1348
sheet = self .book .get_sheet_by_name (name = sheetname )
@@ -1350,11 +1371,13 @@ def _parse_xlsx(self, sheetname, header=0, skiprows=None, index_col=None,
1350
1371
parse_dates = parse_dates ,
1351
1372
date_parser = date_parser ,
1352
1373
skiprows = skiprows ,
1374
+ skip_footer = skip_footer ,
1353
1375
chunksize = chunksize )
1354
1376
1355
1377
return parser .get_chunk ()
1356
1378
1357
- def _parse_xls (self , sheetname , header = 0 , skiprows = None , index_col = None ,
1379
+ def _parse_xls (self , sheetname , header = 0 , skiprows = None ,
1380
+ skip_footer = 0 , index_col = None ,
1358
1381
parse_cols = None , parse_dates = False , date_parser = None ,
1359
1382
na_values = None , thousands = None , chunksize = None ):
1360
1383
from datetime import MINYEAR , time , datetime
@@ -1394,6 +1417,7 @@ def _parse_xls(self, sheetname, header=0, skiprows=None, index_col=None,
1394
1417
parse_dates = parse_dates ,
1395
1418
date_parser = date_parser ,
1396
1419
skiprows = skiprows ,
1420
+ skip_footer = skip_footer ,
1397
1421
chunksize = chunksize )
1398
1422
1399
1423
return parser .get_chunk ()
0 commit comments