Skip to content

Commit b54d815

Browse files
committed
BUG: Inherit iterator parsers from BaseIterator
closes pandas-dev#12153
1 parent c725222 commit b54d815

File tree

4 files changed

+17
-46
lines changed

4 files changed

+17
-46
lines changed

pandas/io/common.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ def UnicodeReader(f, dialect=csv.excel, encoding="utf-8", **kwds):
408408
def UnicodeWriter(f, dialect=csv.excel, encoding="utf-8", **kwds):
409409
return csv.writer(f, dialect=dialect, **kwds)
410410
else:
411-
class UnicodeReader:
411+
class UnicodeReader(BaseIterator):
412412

413413
"""
414414
A CSV reader which will iterate over lines in the CSV file "f",
@@ -422,16 +422,10 @@ def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
422422
f = UTF8Recoder(f, encoding)
423423
self.reader = csv.reader(f, dialect=dialect, **kwds)
424424

425-
def next(self):
425+
def __next__(self):
426426
row = next(self.reader)
427427
return [compat.text_type(s, "utf-8") for s in row]
428428

429-
# python 3 iterator
430-
__next__ = next
431-
432-
def __iter__(self): # pragma: no cover
433-
return self
434-
435429
class UnicodeWriter:
436430

437431
"""

pandas/io/parsers.py

+7-16
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
from pandas.core.config import get_option
2020
from pandas.io.date_converters import generic_parser
2121
from pandas.io.common import (get_filepath_or_buffer, _validate_header_arg,
22-
_get_handle, UnicodeReader, UTF8Recoder)
22+
_get_handle, UnicodeReader, UTF8Recoder,
23+
BaseIterator)
2324
from pandas.tseries import tools
2425

2526
from pandas.util.decorators import Appender
@@ -545,7 +546,7 @@ def read_fwf(filepath_or_buffer, colspecs='infer', widths=None, **kwds):
545546
])
546547

547548

548-
class TextFileReader(object):
549+
class TextFileReader(BaseIterator):
549550
"""
550551
551552
Passed dialect overrides any of the related parser options
@@ -724,15 +725,8 @@ def _clean_options(self, options, engine):
724725

725726
return result, engine
726727

727-
def __iter__(self):
728-
try:
729-
if self.chunksize:
730-
while True:
731-
yield self.read(self.chunksize)
732-
else:
733-
yield self.read()
734-
except StopIteration:
735-
pass
728+
def __next__(self):
729+
return self.get_chunk()
736730

737731
def _make_engine(self, engine='c'):
738732
if engine == 'c':
@@ -2363,7 +2357,7 @@ def _concat_date_cols(date_cols):
23632357
return rs
23642358

23652359

2366-
class FixedWidthReader(object):
2360+
class FixedWidthReader(BaseIterator):
23672361
"""
23682362
A reader of fixed-width lines.
23692363
"""
@@ -2417,7 +2411,7 @@ def detect_colspecs(self, n=100):
24172411
edges = np.where((mask ^ shifted) == 1)[0]
24182412
return list(zip(edges[::2], edges[1::2]))
24192413

2420-
def next(self):
2414+
def __next__(self):
24212415
if self.buffer is not None:
24222416
try:
24232417
line = next(self.buffer)
@@ -2430,9 +2424,6 @@ def next(self):
24302424
return [line[fromm:to].strip(self.delimiter)
24312425
for (fromm, to) in self.colspecs]
24322426

2433-
# Iterator protocol in Python 3 uses __next__()
2434-
__next__ = next
2435-
24362427

24372428
class FixedWidthFieldParser(PythonParser):
24382429
"""

pandas/io/sas.py

+4-11
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from datetime import datetime
1212
import pandas as pd
13-
from pandas.io.common import get_filepath_or_buffer
13+
from pandas.io.common import get_filepath_or_buffer, BaseIterator
1414
from pandas import compat
1515
import struct
1616
import numpy as np
@@ -242,7 +242,7 @@ def _parse_float_vec(vec):
242242
return ieee
243243

244244

245-
class XportReader(object):
245+
class XportReader(BaseIterator):
246246
__doc__ = _xport_reader_doc
247247

248248
def __init__(self, filepath_or_buffer, index=None, encoding='ISO-8859-1',
@@ -369,15 +369,8 @@ def _read_header(self):
369369
dtype = np.dtype(dtypel)
370370
self._dtype = dtype
371371

372-
def __iter__(self):
373-
try:
374-
if self._chunksize:
375-
while True:
376-
yield self.read(self._chunksize)
377-
else:
378-
yield self.read()
379-
except StopIteration:
380-
pass
372+
def __next__(self):
373+
return self.read(nrows=self._chunksize or 1)
381374

382375
def _record_count(self):
383376
"""

pandas/io/stata.py

+4-11
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from pandas.util.decorators import Appender
2626
import pandas as pd
2727
import pandas.core.common as com
28-
from pandas.io.common import get_filepath_or_buffer
28+
from pandas.io.common import get_filepath_or_buffer, BaseIterator
2929
from pandas.lib import max_len_string_array, infer_dtype
3030
from pandas.tslib import NaT, Timestamp
3131

@@ -907,7 +907,7 @@ def _decode_bytes(self, str, errors=None):
907907
return str
908908

909909

910-
class StataReader(StataParser):
910+
class StataReader(StataParser, BaseIterator):
911911
__doc__ = _stata_reader_doc
912912

913913
def __init__(self, path_or_buf, convert_dates=True,
@@ -1377,15 +1377,8 @@ def data(self, **kwargs):
13771377

13781378
return self.read(None, **kwargs)
13791379

1380-
def __iter__(self):
1381-
try:
1382-
if self._chunksize:
1383-
while True:
1384-
yield self.read(self._chunksize)
1385-
else:
1386-
yield self.read()
1387-
except StopIteration:
1388-
pass
1380+
def __next__(self):
1381+
return self.read(nrows=self._chunksize or 1)
13891382

13901383
def get_chunk(self, size=None):
13911384
"""

0 commit comments

Comments
 (0)