diff options
Diffstat (limited to 'numpy')
35 files changed, 490 insertions, 437 deletions
diff --git a/numpy/__init__.py b/numpy/__init__.py index 9cae9d388..f8c1de5ce 100644 --- a/numpy/__init__.py +++ b/numpy/__init__.py @@ -106,6 +106,8 @@ Exceptions to this rule are documented. """ from __future__ import division, absolute_import +import sys + # We first need to detect if we're being called as part of the numpy setup # procedure itself in a reliable manner. try: @@ -160,8 +162,11 @@ else: # Make these accessible from numpy name-space # but not imported in from numpy import * - from __builtin__ import bool, int, long, float, complex, \ - object, unicode, str + if sys.version_info[0] >= 3: + from builtins import bool, int, long, float, complex, object, unicode, str + else: + from __builtin__ import bool, int, long, float, complex, object, unicode, str + from .core import round, abs, max, min __all__.extend(['__version__', 'pkgload', 'PackageLoader', diff --git a/numpy/core/__init__.py b/numpy/core/__init__.py index f055d289e..d2f7c3c8c 100644 --- a/numpy/core/__init__.py +++ b/numpy/core/__init__.py @@ -62,10 +62,10 @@ def _ufunc_reduce(func): import sys -if sys.version_info[0] < 3: - import copy_reg as copyreg -else: +if sys.version_info[0] >= 3: import copyreg +else: + import copy_reg as copyreg copyreg.pickle(ufunc, _ufunc_reduce, _ufunc_reconstruct) # Unclutter namespace (must keep _ufunc_reconstruct for unpickling) diff --git a/numpy/core/numeric.py b/numpy/core/numeric.py index 25f977254..5f4504eb9 100644 --- a/numpy/core/numeric.py +++ b/numpy/core/numeric.py @@ -1,5 +1,22 @@ from __future__ import division, absolute_import +import sys +import warnings +from . import multiarray +from . import umath +from .umath import * +from . import numerictypes +from .numerictypes import * +import collections + +if sys.version_info[0] >= 3: + import pickle +else: + import cPickle as pickle + +loads = pickle.loads + + __all__ = ['newaxis', 'ndarray', 'flatiter', 'nditer', 'nested_iters', 'ufunc', 'arange', 'array', 'zeros', 'count_nonzero', 'empty', 'broadcast', 'dtype', 'fromstring', 'fromfile', @@ -24,19 +41,10 @@ __all__ = ['newaxis', 'ndarray', 'flatiter', 'nditer', 'nested_iters', 'ufunc', 'CLIP', 'RAISE', 'WRAP', 'MAXDIMS', 'BUFSIZE', 'ALLOW_THREADS', 'ComplexWarning'] -import sys -import warnings -from . import multiarray -from . import umath -from .umath import * -from . import numerictypes -from .numerictypes import * -import collections - - if sys.version_info[0] < 3: __all__.extend(['getbuffer', 'newbuffer']) + class ComplexWarning(RuntimeWarning): """ The warning raised when casting a complex dtype to a real dtype. @@ -1861,9 +1869,6 @@ def base_repr(number, base=2, padding=0): res.append('-') return ''.join(reversed(res or '0')) -from cPickle import load, loads -_cload = load -_file = open def load(file): """ @@ -1880,8 +1885,8 @@ def load(file): """ if isinstance(file, type("")): - file = _file(file,"rb") - return _cload(file) + file = open(file, "rb") + return pickle.load(file) # These are all essentially abbreviations # These might wind up in a special abbreviations module diff --git a/numpy/core/numerictypes.py b/numpy/core/numerictypes.py index a1af9d80d..8bf0cc880 100644 --- a/numpy/core/numerictypes.py +++ b/numpy/core/numerictypes.py @@ -98,7 +98,11 @@ import sys # we don't export these for import *, but we do want them accessible # as numerictypes.bool, etc. -from __builtin__ import bool, int, long, float, complex, object, unicode, str +if sys.version_info[0] >= 3: + from builtins import bool, int, long, float, complex, object, unicode, str +else: + from __builtin__ import bool, int, long, float, complex, object, unicode, str + from numpy.compat import bytes if sys.version_info[0] >= 3: diff --git a/numpy/core/records.py b/numpy/core/records.py index 385f9866d..7a9481b38 100644 --- a/numpy/core/records.py +++ b/numpy/core/records.py @@ -595,8 +595,8 @@ def fromrecords(recList, dtype=None, shape=None, formats=None, names=None, >>> r.col2 chararray(['dbe', 'de'], dtype='|S3') - >>> import cPickle - >>> print cPickle.loads(cPickle.dumps(r)) + >>> import pickle + >>> print pickle.loads(pickle.dumps(r)) [(456, 'dbe', 1.2) (2, 'de', 1.3)] """ diff --git a/numpy/core/setup.py b/numpy/core/setup.py index c65012126..ea20b11d2 100644 --- a/numpy/core/setup.py +++ b/numpy/core/setup.py @@ -4,12 +4,14 @@ import imp import os import sys import shutil +import pickle +import copy +import warnings +import re from os.path import join from numpy.distutils import log from distutils.dep_util import newer from distutils.sysconfig import get_config_var -import warnings -import re from setup_common import * @@ -25,11 +27,9 @@ NPY_RELAXED_STRIDES_CHECKING = (os.environ.get('NPY_RELAXED_STRIDES_CHECKING', " # configuration informations between extensions is not easy. # Using a pickled-based memoize does not work because config_cmd is an instance # method, which cPickle does not like. -try: - import cPickle as _pik -except ImportError: - import pickle as _pik -import copy +# +# Use pickle in all cases, as cPickle is gone in python3 and the difference +# in time is only in build. -- Charles Harris, 2013-03-30 class CallOnceOnly(object): def __init__(self): @@ -40,25 +40,25 @@ class CallOnceOnly(object): def check_types(self, *a, **kw): if self._check_types is None: out = check_types(*a, **kw) - self._check_types = _pik.dumps(out) + self._check_types = pickle.dumps(out) else: - out = copy.deepcopy(_pik.loads(self._check_types)) + out = copy.deepcopy(pickle.loads(self._check_types)) return out def check_ieee_macros(self, *a, **kw): if self._check_ieee_macros is None: out = check_ieee_macros(*a, **kw) - self._check_ieee_macros = _pik.dumps(out) + self._check_ieee_macros = pickle.dumps(out) else: - out = copy.deepcopy(_pik.loads(self._check_ieee_macros)) + out = copy.deepcopy(pickle.loads(self._check_ieee_macros)) return out def check_complex(self, *a, **kw): if self._check_complex is None: out = check_complex(*a, **kw) - self._check_complex = _pik.dumps(out) + self._check_complex = pickle.dumps(out) else: - out = copy.deepcopy(_pik.loads(self._check_complex)) + out = copy.deepcopy(pickle.loads(self._check_complex)) return out PYTHON_HAS_UNICODE_WIDE = True diff --git a/numpy/core/tests/test_print.py b/numpy/core/tests/test_print.py index 67021c20e..e2469ec7b 100644 --- a/numpy/core/tests/test_print.py +++ b/numpy/core/tests/test_print.py @@ -6,7 +6,11 @@ import nose import locale import sys -from StringIO import StringIO + +if sys.version_info[0] >= 3: + from io import StringIO +else: + from StringIO import StringIO _REF = {np.inf: 'inf', -np.inf: '-inf', np.nan: 'nan'} diff --git a/numpy/core/tests/test_regression.py b/numpy/core/tests/test_regression.py index 4fa554b12..8d3b35bb9 100644 --- a/numpy/core/tests/test_regression.py +++ b/numpy/core/tests/test_regression.py @@ -7,8 +7,9 @@ import gc import copy import warnings import tempfile -from StringIO import StringIO from os import path +from io import BytesIO + import numpy as np from numpy.testing import ( run_module_suite, TestCase, assert_, assert_equal, @@ -18,10 +19,6 @@ from numpy.testing import ( from numpy.testing.utils import _assert_valid_refcount, WarningManager from numpy.compat import asbytes, asunicode, asbytes_nested -if sys.version_info[0] >= 3: - import io - StringIO = io.BytesIO - rlevel = 1 class TestRegression(TestCase): @@ -37,7 +34,7 @@ class TestRegression(TestCase): def test_pickle_transposed(self,level=rlevel): """Ticket #16""" a = np.transpose(np.array([[2,9],[7,0],[3,8]])) - f = StringIO() + f = BytesIO() pickle.dump(a,f) f.seek(0) b = pickle.load(f) @@ -90,7 +87,7 @@ class TestRegression(TestCase): def test_char_dump(self,level=rlevel): """Ticket #50""" - f = StringIO() + f = BytesIO() ca = np.char.array(np.arange(1000,1010),itemsize=4) ca.dump(f) f.seek(0) @@ -322,7 +319,7 @@ class TestRegression(TestCase): def test_unpickle_dtype_with_object(self,level=rlevel): """Implemented in r2840""" dt = np.dtype([('x',int),('y',np.object_),('z','O')]) - f = StringIO() + f = BytesIO() pickle.dump(dt,f) f.seek(0) dt_ = pickle.load(f) @@ -386,7 +383,6 @@ class TestRegression(TestCase): def test_pickle_dtype(self,level=rlevel): """Ticket #251""" - import pickle pickle.dumps(np.float) def test_swap_real(self, level=rlevel): @@ -725,10 +721,9 @@ class TestRegression(TestCase): def test_unicode_scalar(self, level=rlevel): """Ticket #600""" - import cPickle x = np.array(["DROND", "DROND1"], dtype="U6") el = x[1] - new = cPickle.loads(cPickle.dumps(el)) + new = pickle.loads(pickle.dumps(el)) assert_equal(new, el) def test_arange_non_native_dtype(self, level=rlevel): diff --git a/numpy/distutils/cpuinfo.py b/numpy/distutils/cpuinfo.py index 1e2d9379c..aaf642691 100644 --- a/numpy/distutils/cpuinfo.py +++ b/numpy/distutils/cpuinfo.py @@ -18,10 +18,12 @@ __all__ = ['cpu'] import sys, re, types import os -if sys.version_info[0] < 3: - from commands import getstatusoutput -else: + +if sys.version_info[0] >= 3: from subprocess import getstatusoutput +else: + from commands import getstatusoutput + import warnings import platform @@ -488,25 +490,29 @@ class Win32CPUInfo(CPUInfoBase): info = [] try: #XXX: Bad style to use so long `try:...except:...`. Fix it! - import _winreg + if sys.version_info[0] >= 3: + import winreg + else: + import _winreg as winreg + prgx = re.compile(r"family\s+(?P<FML>\d+)\s+model\s+(?P<MDL>\d+)"\ "\s+stepping\s+(?P<STP>\d+)",re.IGNORECASE) - chnd=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, self.pkey) + chnd=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, self.pkey) pnum=0 while 1: try: - proc=_winreg.EnumKey(chnd,pnum) - except _winreg.error: + proc=winreg.EnumKey(chnd,pnum) + except winreg.error: break else: pnum+=1 info.append({"Processor":proc}) - phnd=_winreg.OpenKey(chnd,proc) + phnd=winreg.OpenKey(chnd,proc) pidx=0 while True: try: - name,value,vtpe=_winreg.EnumValue(phnd,pidx) - except _winreg.error: + name,value,vtpe=winreg.EnumValue(phnd,pidx) + except winreg.error: break else: pidx=pidx+1 diff --git a/numpy/distutils/mingw32ccompiler.py b/numpy/distutils/mingw32ccompiler.py index af613e551..c07a58e26 100644 --- a/numpy/distutils/mingw32ccompiler.py +++ b/numpy/distutils/mingw32ccompiler.py @@ -10,7 +10,6 @@ Support code for building Python extensions on Windows. from __future__ import division, absolute_import import os -import subprocess import sys import subprocess import re diff --git a/numpy/distutils/misc_util.py b/numpy/distutils/misc_util.py index 48bbcf005..dea993b20 100644 --- a/numpy/distutils/misc_util.py +++ b/numpy/distutils/misc_util.py @@ -2125,9 +2125,13 @@ def get_info(pkgname, dirs=None): return info def is_bootstrapping(): - import __builtin__ + if sys.version_info[0] >= 3: + import builtins + else: + import __builtin__ as builtins + try: - __builtin__.__NUMPY_SETUP__ + builtins.__NUMPY_SETUP__ return True except AttributeError: return False diff --git a/numpy/distutils/npy_pkg_config.py b/numpy/distutils/npy_pkg_config.py index 2dacbbc70..a0d75670b 100644 --- a/numpy/distutils/npy_pkg_config.py +++ b/numpy/distutils/npy_pkg_config.py @@ -1,13 +1,14 @@ from __future__ import division, absolute_import import sys +import re +import os +import shlex + if sys.version_info[0] < 3: from ConfigParser import SafeConfigParser, NoOptionError else: from configparser import ConfigParser, SafeConfigParser, NoOptionError -import re -import os -import shlex __all__ = ['FormatError', 'PkgNotFound', 'LibraryInfo', 'VariableSet', 'read_config', 'parse_flags'] diff --git a/numpy/distutils/system_info.py b/numpy/distutils/system_info.py index 68ad926e3..ff32daf69 100644 --- a/numpy/distutils/system_info.py +++ b/numpy/distutils/system_info.py @@ -118,6 +118,7 @@ import re import copy import warnings from glob import glob + if sys.version_info[0] < 3: from ConfigParser import NoOptionError, ConfigParser else: diff --git a/numpy/distutils/tests/test_exec_command.py b/numpy/distutils/tests/test_exec_command.py index 11f262369..3e85fcd3e 100644 --- a/numpy/distutils/tests/test_exec_command.py +++ b/numpy/distutils/tests/test_exec_command.py @@ -2,11 +2,16 @@ from __future__ import division, absolute_import import os import sys -import StringIO from tempfile import TemporaryFile from numpy.distutils import exec_command +# In python 3 stdout, stderr are text (unicode compliant) devices, so to +# emulate them import StringIO from the io module. +if sys.version_info[0] >= 3: + from io import StringIO +else: + from StringIO import StringIO class redirect_stdout(object): """Context manager to redirect stdout for exec_command test.""" @@ -62,26 +67,26 @@ def test_exec_command_stdout(): # both that the special case works and that the generic code works. # Test posix version: - with redirect_stdout(StringIO.StringIO()): + with redirect_stdout(StringIO()): with redirect_stderr(TemporaryFile()): exec_command.exec_command("cd '.'") if os.name == 'posix': # Test general (non-posix) version: with emulate_nonposix(): - with redirect_stdout(StringIO.StringIO()): + with redirect_stdout(StringIO()): with redirect_stderr(TemporaryFile()): exec_command.exec_command("cd '.'") def test_exec_command_stderr(): # Test posix version: with redirect_stdout(TemporaryFile(mode='w+')): - with redirect_stderr(StringIO.StringIO()): + with redirect_stderr(StringIO()): exec_command.exec_command("cd '.'") if os.name == 'posix': # Test general (non-posix) version: with emulate_nonposix(): with redirect_stdout(TemporaryFile()): - with redirect_stderr(StringIO.StringIO()): + with redirect_stderr(StringIO()): exec_command.exec_command("cd '.'") diff --git a/numpy/f2py/__init__.py b/numpy/f2py/__init__.py index 951544588..6b20f94c4 100644 --- a/numpy/f2py/__init__.py +++ b/numpy/f2py/__init__.py @@ -5,7 +5,7 @@ __all__ = ['run_main','compile','f2py_testing'] import os import sys -import commands +import subprocess from . import f2py2e from . import f2py_testing diff --git a/numpy/f2py/doc/collectinput.py b/numpy/f2py/doc/collectinput.py index 078da8eeb..396e4a912 100755 --- a/numpy/f2py/doc/collectinput.py +++ b/numpy/f2py/doc/collectinput.py @@ -27,7 +27,11 @@ stdoutflag=0 import sys import fileinput import re -import commands + +if sys.version_info[0] >= 3: + from subprocess import getoutput +else: + from commands import getoutput try: fn=sys.argv[2] except: @@ -69,7 +73,7 @@ for l in fileinput.input(fi): elif flag==1: sys.stderr.write(fn+'\n') print '%%%%% Begin of '+fn - print commands.getoutput(sys.argv[0]+' < '+fn) + print getoutput(sys.argv[0]+' < '+fn) print '%%%%% End of '+fn else: sys.stderr.write('Could not extract a file name from: '+l) diff --git a/numpy/lib/_datasource.py b/numpy/lib/_datasource.py index db97c5507..9f0bb1ae8 100644 --- a/numpy/lib/_datasource.py +++ b/numpy/lib/_datasource.py @@ -36,6 +36,7 @@ from __future__ import division, absolute_import __docformat__ = "restructuredtext en" import os +import sys from shutil import rmtree, copyfile, copyfileobj _open = open @@ -252,7 +253,10 @@ class DataSource (object): """Test if path is a net location. Tests the scheme and netloc.""" # We do this here to reduce the 'import numpy' initial import time. - from urlparse import urlparse + if sys.version_info[0] >= 3: + from urllib.parse import urlparse + else: + from urlparse import urlparse # BUG : URLs require a scheme string ('http://') to be used. # www.google.com will fail. @@ -351,8 +355,10 @@ class DataSource (object): """ # We do this here to reduce the 'import numpy' initial import time. - from urlparse import urlparse - + if sys.version_info[0] >= 3: + from urllib.parse import urlparse + else: + from urlparse import urlparse # TODO: This should be more robust. Handles case where path includes # the destpath, but not other sub-paths. Failing case: diff --git a/numpy/lib/_iotools.py b/numpy/lib/_iotools.py index 8054c2662..f3097be23 100644 --- a/numpy/lib/_iotools.py +++ b/numpy/lib/_iotools.py @@ -8,7 +8,11 @@ __docformat__ = "restructuredtext en" import sys import numpy as np import numpy.core.numeric as nx -from __builtin__ import bool, int, long, float, complex, object, unicode, str + +if sys.version_info[0] >= 3: + from builtins import bool, int, long, float, complex, object, unicode, str +else: + from __builtin__ import bool, int, long, float, complex, object, unicode, str from numpy.compat import asbytes, bytes, asbytes_nested diff --git a/numpy/lib/format.py b/numpy/lib/format.py index a4e8495b5..b41588d6b 100644 --- a/numpy/lib/format.py +++ b/numpy/lib/format.py @@ -136,13 +136,16 @@ alternatives, is described fully in the "npy-format" NEP. """ from __future__ import division, absolute_import -import cPickle - import numpy import sys from numpy.lib.utils import safe_eval from numpy.compat import asbytes, isfileobj +if sys.version_info[0] >= 3: + import pickle +else: + import cPickle as pickle + MAGIC_PREFIX = asbytes('\x93NUMPY') MAGIC_LEN = len(MAGIC_PREFIX) + 2 @@ -399,7 +402,7 @@ def write_array(fp, array, version=(1,0)): if array.dtype.hasobject: # We contain Python objects so we cannot write out the data directly. # Instead, we will pickle it out with version 2 of the pickle protocol. - cPickle.dump(array, fp, protocol=2) + pickle.dump(array, fp, protocol=2) elif array.flags.f_contiguous and not array.flags.c_contiguous: if isfileobj(fp): array.T.tofile(fp) @@ -447,7 +450,7 @@ def read_array(fp): # Now read the actual data. if dtype.hasobject: # The array contained Python objects. We need to unpickle the data. - array = cPickle.load(fp) + array = pickle.load(fp) else: if isfileobj(fp): # We can use the fast fromfile() function. diff --git a/numpy/lib/npyio.py b/numpy/lib/npyio.py index ede54ecc7..2cd375ef9 100644 --- a/numpy/lib/npyio.py +++ b/numpy/lib/npyio.py @@ -1,9 +1,5 @@ from __future__ import division, absolute_import -__all__ = ['savetxt', 'loadtxt', 'genfromtxt', 'ndfromtxt', 'mafromtxt', - 'recfromtxt', 'recfromcsv', 'load', 'loads', 'save', 'savez', - 'savez_compressed', 'packbits', 'unpackbits', 'fromregex', 'DataSource'] - import numpy as np from . import format import sys @@ -15,7 +11,6 @@ import warnings import weakref from operator import itemgetter -from cPickle import load as _cload, loads from ._datasource import DataSource from ._compiled_base import packbits, unpackbits @@ -25,11 +20,18 @@ from ._iotools import LineSplitter, NameValidator, StringConverter, \ easy_dtype, _bytes_to_name from numpy.compat import asbytes, asstr, asbytes_nested, bytes +from io import BytesIO if sys.version_info[0] >= 3: - from io import BytesIO + import pickle else: - from cStringIO import StringIO as BytesIO + import cPickle as pickle + +loads = pickle.loads + +__all__ = ['savetxt', 'loadtxt', 'genfromtxt', 'ndfromtxt', 'mafromtxt', + 'recfromtxt', 'recfromcsv', 'load', 'loads', 'save', 'savez', + 'savez_compressed', 'packbits', 'unpackbits', 'fromregex', 'DataSource'] _string_like = _is_string_like @@ -380,7 +382,7 @@ def load(file, mmap_mode=None): return format.read_array(fid) else: # Try a pickle try: - return _cload(fid) + return pickle.load(fid) except: raise IOError( "Failed to interpret file %s as a pickle" % repr(file)) diff --git a/numpy/lib/tests/test__datasource.py b/numpy/lib/tests/test__datasource.py index e784e4296..ccd7405fe 100644 --- a/numpy/lib/tests/test__datasource.py +++ b/numpy/lib/tests/test__datasource.py @@ -1,17 +1,20 @@ from __future__ import division, absolute_import import os +import urllib2 +import sys +import numpy.lib._datasource as datasource from tempfile import mkdtemp, mkstemp, NamedTemporaryFile from shutil import rmtree -from urlparse import urlparse from urllib2 import URLError -import urllib2 - +from numpy.compat import asbytes from numpy.testing import * -from numpy.compat import asbytes -import numpy.lib._datasource as datasource +if sys.version_info[0] >= 3: + from urllib.parse import urlparse +else: + from urlparse import urlparse def urlopen_stub(url, data=None): '''Stub to replace urlopen for testing.''' diff --git a/numpy/lib/tests/test__iotools.py b/numpy/lib/tests/test__iotools.py index ebb01ad3a..1cd9a25da 100644 --- a/numpy/lib/tests/test__iotools.py +++ b/numpy/lib/tests/test__iotools.py @@ -1,22 +1,13 @@ from __future__ import division, absolute_import import sys - -if sys.version_info[0] >= 3: - from io import BytesIO - def StringIO(s=""): - return BytesIO(asbytes(s)) -else: - from StringIO import StringIO - -from datetime import date import time +from datetime import date import numpy as np from numpy.lib._iotools import LineSplitter, NameValidator, StringConverter, \ has_nested_fields, easy_dtype, flatten_dtype from numpy.testing import * - from numpy.compat import asbytes, asbytes_nested class TestLineSplitter(TestCase): diff --git a/numpy/lib/tests/test_format.py b/numpy/lib/tests/test_format.py index 5c07da1c3..aae3b1ba8 100644 --- a/numpy/lib/tests/test_format.py +++ b/numpy/lib/tests/test_format.py @@ -5,10 +5,7 @@ r''' Test the .npy file format. Set up: >>> import sys - >>> if sys.version_info[0] >= 3: - ... from io import BytesIO as StringIO - ... else: - ... from cStringIO import StringIO + >>> from io import BytesIO >>> from numpy.lib import format >>> >>> scalars = [ @@ -101,19 +98,19 @@ Test the magic string writing. Test the magic string reading. - >>> format.read_magic(StringIO(format.magic(1, 0))) + >>> format.read_magic(BytesIO(format.magic(1, 0))) (1, 0) - >>> format.read_magic(StringIO(format.magic(0, 0))) + >>> format.read_magic(BytesIO(format.magic(0, 0))) (0, 0) - >>> format.read_magic(StringIO(format.magic(255, 255))) + >>> format.read_magic(BytesIO(format.magic(255, 255))) (255, 255) - >>> format.read_magic(StringIO(format.magic(2, 5))) + >>> format.read_magic(BytesIO(format.magic(2, 5))) (2, 5) Test the header writing. >>> for arr in basic_arrays + record_arrays: - ... f = StringIO() + ... f = BytesIO() ... format.write_array_header_1_0(f, arr) # XXX: arr is not a dict, items gets called on it ... print repr(f.getvalue()) ... @@ -279,22 +276,15 @@ Test the header writing. "\x16\x02{'descr': [('x', '>i4', (2,)),\n ('Info',\n [('value', '>c16'),\n ('y2', '>f8'),\n ('Info2',\n [('name', '|S2'),\n ('value', '>c16', (2,)),\n ('y3', '>f8', (2,)),\n ('z3', '>u4', (2,))]),\n ('name', '|S2'),\n ('z2', '|b1')]),\n ('color', '|S2'),\n ('info', [('Name', '>U8'), ('Value', '>c16')]),\n ('y', '>f8', (2, 2)),\n ('z', '|u1')],\n 'fortran_order': False,\n 'shape': (2,)} \n" ''' - import sys import os import shutil import tempfile - -if sys.version_info[0] >= 3: - from io import BytesIO as StringIO -else: - from cStringIO import StringIO +from io import BytesIO import numpy as np from numpy.testing import * - from numpy.lib import format - from numpy.compat import asbytes, asbytes_nested @@ -416,9 +406,9 @@ record_arrays = [ ] def roundtrip(arr): - f = StringIO() + f = BytesIO() format.write_array(f, arr) - f2 = StringIO(f.getvalue()) + f2 = BytesIO(f.getvalue()) arr2 = format.read_array(f2) return arr2 @@ -469,7 +459,7 @@ def test_memmap_roundtrip(): def test_write_version_1_0(): - f = StringIO() + f = BytesIO() arr = np.arange(1) # These should pass. format.write_array(f, arr, version=(1, 0)) @@ -513,12 +503,12 @@ malformed_magic = asbytes_nested([ def test_read_magic_bad_magic(): for magic in malformed_magic: - f = StringIO(magic) + f = BytesIO(magic) yield raises(ValueError)(format.read_magic), f def test_read_version_1_0_bad_magic(): for magic in bad_version_magic + malformed_magic: - f = StringIO(magic) + f = BytesIO(magic) yield raises(ValueError)(format.read_array), f def test_bad_magic_args(): @@ -528,29 +518,29 @@ def test_bad_magic_args(): assert_raises(ValueError, format.magic, 1, 256) def test_large_header(): - s = StringIO() + s = BytesIO() d = {'a':1,'b':2} format.write_array_header_1_0(s,d) - s = StringIO() + s = BytesIO() d = {'a':1,'b':2,'c':'x'*256*256} assert_raises(ValueError, format.write_array_header_1_0, s, d) def test_bad_header(): # header of length less than 2 should fail - s = StringIO() + s = BytesIO() assert_raises(ValueError, format.read_array_header_1_0, s) - s = StringIO(asbytes('1')) + s = BytesIO(asbytes('1')) assert_raises(ValueError, format.read_array_header_1_0, s) # header shorter than indicated size should fail - s = StringIO(asbytes('\x01\x00')) + s = BytesIO(asbytes('\x01\x00')) assert_raises(ValueError, format.read_array_header_1_0, s) # headers without the exact keys required should fail d = {"shape":(1,2), "descr":"x"} - s = StringIO() + s = BytesIO() format.write_array_header_1_0(s,d) assert_raises(ValueError, format.read_array_header_1_0, s) @@ -558,7 +548,7 @@ def test_bad_header(): "fortran_order":False, "descr":"x", "extrakey":-1} - s = StringIO() + s = BytesIO() format.write_array_header_1_0(s,d) assert_raises(ValueError, format.read_array_header_1_0, s) diff --git a/numpy/lib/tests/test_io.py b/numpy/lib/tests/test_io.py index ab990976e..6b5173890 100644 --- a/numpy/lib/tests/test_io.py +++ b/numpy/lib/tests/test_io.py @@ -4,31 +4,43 @@ import sys import gzip import os import threading -from tempfile import mkstemp, NamedTemporaryFile import time -from datetime import datetime import warnings import gc +from tempfile import mkstemp, NamedTemporaryFile +from io import BytesIO +from datetime import datetime from numpy.testing.utils import WarningManager import numpy as np import numpy.ma as ma from numpy.lib._iotools import ConverterError, ConverterLockError, \ ConversionWarning -from numpy.compat import asbytes, asbytes_nested, bytes - +from numpy.compat import asbytes, asbytes_nested, bytes, asstr from nose import SkipTest from numpy.ma.testutils import (TestCase, assert_equal, assert_array_equal, assert_raises, run_module_suite) from numpy.testing import assert_warns, assert_, build_err_msg -if sys.version_info[0] >= 3: - from io import BytesIO - def StringIO(s=""): - return BytesIO(asbytes(s)) -else: - from StringIO import StringIO - BytesIO = StringIO + +class TextIO(BytesIO): + """Helper IO class. + + Writes encode strings to bytes if needed, reads return bytes. + This makes it easier to emulate files opened in binary mode + without needing to explicitly convert strings to bytes in + setting up the test data. + + """ + def __init__(self, s=""): + BytesIO.__init__(self, asbytes(s)) + + def write(self, s): + BytesIO.write(self, asbytes(s)) + + def writelines(self, lines): + BytesIO.writelines(self, [asbytes(s) for s in lines]) + MAJVER, MINVER = sys.version_info[:2] @@ -73,7 +85,7 @@ class RoundtripTest(object): target_file = NamedTemporaryFile() load_file = target_file.name else: - target_file = StringIO() + target_file = BytesIO() load_file = target_file arr = args @@ -135,7 +147,7 @@ class TestSavezLoad(RoundtripTest, TestCase): def test_named_arrays(self): a = np.array([[1, 2], [3, 4]], float) b = np.array([[1 + 2j, 2 + 7j], [3 - 6j, 4 + 12j]], complex) - c = StringIO() + c = BytesIO() np.savez(c, file_a=a, file_b=b) c.seek(0) l = np.load(c) @@ -228,95 +240,94 @@ class TestSaveTxt(TestCase): def test_array(self): a = np.array([[1, 2], [3, 4]], float) fmt = "%.18e" - c = StringIO() + c = BytesIO() np.savetxt(c, a, fmt=fmt) c.seek(0) assert_equal(c.readlines(), - asbytes_nested( - [(fmt + ' ' + fmt + '\n') % (1, 2), - (fmt + ' ' + fmt + '\n') % (3, 4)])) + [asbytes((fmt + ' ' + fmt + '\n') % (1, 2)), + asbytes((fmt + ' ' + fmt + '\n') % (3, 4))]) a = np.array([[1, 2], [3, 4]], int) - c = StringIO() + c = BytesIO() np.savetxt(c, a, fmt='%d') c.seek(0) - assert_equal(c.readlines(), asbytes_nested(['1 2\n', '3 4\n'])) + assert_equal(c.readlines(), [b'1 2\n', b'3 4\n']) def test_1D(self): a = np.array([1, 2, 3, 4], int) - c = StringIO() + c = BytesIO() np.savetxt(c, a, fmt='%d') c.seek(0) lines = c.readlines() - assert_equal(lines, asbytes_nested(['1\n', '2\n', '3\n', '4\n'])) + assert_equal(lines, [b'1\n', b'2\n', b'3\n', b'4\n']) def test_record(self): a = np.array([(1, 2), (3, 4)], dtype=[('x', 'i4'), ('y', 'i4')]) - c = StringIO() + c = BytesIO() np.savetxt(c, a, fmt='%d') c.seek(0) - assert_equal(c.readlines(), asbytes_nested(['1 2\n', '3 4\n'])) + assert_equal(c.readlines(), [b'1 2\n', b'3 4\n']) def test_delimiter(self): a = np.array([[1., 2.], [3., 4.]]) - c = StringIO() - np.savetxt(c, a, delimiter=asbytes(','), fmt='%d') + c = BytesIO() + np.savetxt(c, a, delimiter=',', fmt='%d') c.seek(0) - assert_equal(c.readlines(), asbytes_nested(['1,2\n', '3,4\n'])) + assert_equal(c.readlines(), [b'1,2\n', b'3,4\n']) def test_format(self): a = np.array([(1, 2), (3, 4)]) - c = StringIO() + c = BytesIO() # Sequence of formats np.savetxt(c, a, fmt=['%02d', '%3.1f']) c.seek(0) - assert_equal(c.readlines(), asbytes_nested(['01 2.0\n', '03 4.0\n'])) + assert_equal(c.readlines(), [b'01 2.0\n', b'03 4.0\n']) # A single multiformat string - c = StringIO() + c = BytesIO() np.savetxt(c, a, fmt='%02d : %3.1f') c.seek(0) lines = c.readlines() - assert_equal(lines, asbytes_nested(['01 : 2.0\n', '03 : 4.0\n'])) + assert_equal(lines, [b'01 : 2.0\n', b'03 : 4.0\n']) # Specify delimiter, should be overiden - c = StringIO() + c = BytesIO() np.savetxt(c, a, fmt='%02d : %3.1f', delimiter=',') c.seek(0) lines = c.readlines() - assert_equal(lines, asbytes_nested(['01 : 2.0\n', '03 : 4.0\n'])) + assert_equal(lines, [b'01 : 2.0\n', b'03 : 4.0\n']) def test_header_footer(self): """ Test the functionality of the header and footer keyword argument. """ - c = StringIO() + c = BytesIO() a = np.array([(1, 2), (3, 4)], dtype=np.int) test_header_footer = 'Test header / footer' # Test the header keyword argument np.savetxt(c, a, fmt='%1d', header=test_header_footer) c.seek(0) assert_equal(c.read(), - asbytes('# ' + test_header_footer +'\n1 2\n3 4\n' )) + asbytes('# ' + test_header_footer + '\n1 2\n3 4\n')) # Test the footer keyword argument - c = StringIO() + c = BytesIO() np.savetxt(c, a, fmt='%1d', footer=test_header_footer) c.seek(0) assert_equal(c.read(), asbytes('1 2\n3 4\n# ' + test_header_footer + '\n')) # Test the commentstr keyword argument used on the header - c = StringIO() + c = BytesIO() commentstr = '% ' - np.savetxt(c, a, fmt='%1d', header=test_header_footer, - comments=commentstr) + np.savetxt(c, a, fmt='%1d', + header=test_header_footer, comments=commentstr) c.seek(0) assert_equal(c.read(), asbytes(commentstr + test_header_footer + '\n' + '1 2\n3 4\n')) # Test the commentstr keyword argument used on the footer - c = StringIO() + c = BytesIO() commentstr = '% ' - np.savetxt(c, a, fmt='%1d', footer=test_header_footer, - comments=commentstr) + np.savetxt(c, a, fmt='%1d', + footer=test_header_footer, comments=commentstr) c.seek(0) assert_equal(c.read(), asbytes('1 2\n3 4\n' + commentstr + test_header_footer + '\n')) @@ -340,29 +351,29 @@ class TestSaveTxt(TestCase): im = np.e a[:] = re + 1.0j * im # One format only - c = StringIO() + c = BytesIO() np.savetxt(c, a, fmt=' %+.3e') c.seek(0) lines = c.readlines() - _assert_floatstr_lines_equal(lines, asbytes_nested([ - ' ( +3.142e+00+ +2.718e+00j) ( +3.142e+00+ +2.718e+00j)\n', - ' ( +3.142e+00+ +2.718e+00j) ( +3.142e+00+ +2.718e+00j)\n'])) + _assert_floatstr_lines_equal(lines, + [b' ( +3.142e+00+ +2.718e+00j) ( +3.142e+00+ +2.718e+00j)\n', + b' ( +3.142e+00+ +2.718e+00j) ( +3.142e+00+ +2.718e+00j)\n']) # One format for each real and imaginary part - c = StringIO() + c = BytesIO() np.savetxt(c, a, fmt=' %+.3e' * 2 * ncols) c.seek(0) lines = c.readlines() - _assert_floatstr_lines_equal(lines, asbytes_nested([ - ' +3.142e+00 +2.718e+00 +3.142e+00 +2.718e+00\n', - ' +3.142e+00 +2.718e+00 +3.142e+00 +2.718e+00\n'])) + _assert_floatstr_lines_equal(lines, + [b' +3.142e+00 +2.718e+00 +3.142e+00 +2.718e+00\n', + b' +3.142e+00 +2.718e+00 +3.142e+00 +2.718e+00\n']) # One format for each complex number - c = StringIO() + c = BytesIO() np.savetxt(c, a, fmt=['(%.3e%+.3ej)'] * ncols) c.seek(0) lines = c.readlines() - _assert_floatstr_lines_equal(lines, asbytes_nested([ - '(3.142e+00+2.718e+00j) (3.142e+00+2.718e+00j)\n', - '(3.142e+00+2.718e+00j) (3.142e+00+2.718e+00j)\n'])) + _assert_floatstr_lines_equal(lines, + [b'(3.142e+00+2.718e+00j) (3.142e+00+2.718e+00j)\n', + b'(3.142e+00+2.718e+00j) (3.142e+00+2.718e+00j)\n']) def _assert_floatstr_lines_equal(actual_lines, expected_lines): @@ -387,15 +398,15 @@ def _assert_floatstr_lines_equal(actual_lines, expected_lines): class TestLoadTxt(TestCase): def test_record(self): - c = StringIO() - c.write(asbytes('1 2\n3 4')) + c = TextIO() + c.write('1 2\n3 4') c.seek(0) x = np.loadtxt(c, dtype=[('x', np.int32), ('y', np.int32)]) a = np.array([(1, 2), (3, 4)], dtype=[('x', 'i4'), ('y', 'i4')]) assert_array_equal(x, a) - d = StringIO() - d.write(asbytes('M 64.0 75.0\nF 25.0 60.0')) + d = TextIO() + d.write('M 64.0 75.0\nF 25.0 60.0') d.seek(0) mydescriptor = {'names': ('gender', 'age', 'weight'), 'formats': ('S1', @@ -406,8 +417,8 @@ class TestLoadTxt(TestCase): assert_array_equal(y, b) def test_array(self): - c = StringIO() - c.write(asbytes('1 2\n3 4')) + c = TextIO() + c.write('1 2\n3 4') c.seek(0) x = np.loadtxt(c, dtype=int) @@ -420,23 +431,23 @@ class TestLoadTxt(TestCase): assert_array_equal(x, a) def test_1D(self): - c = StringIO() - c.write(asbytes('1\n2\n3\n4\n')) + c = TextIO() + c.write('1\n2\n3\n4\n') c.seek(0) x = np.loadtxt(c, dtype=int) a = np.array([1, 2, 3, 4], int) assert_array_equal(x, a) - c = StringIO() - c.write(asbytes('1,2,3,4\n')) + c = TextIO() + c.write('1,2,3,4\n') c.seek(0) x = np.loadtxt(c, dtype=int, delimiter=',') a = np.array([1, 2, 3, 4], int) assert_array_equal(x, a) def test_missing(self): - c = StringIO() - c.write(asbytes('1,2,3,,5\n')) + c = TextIO() + c.write('1,2,3,,5\n') c.seek(0) x = np.loadtxt(c, dtype=int, delimiter=',', \ converters={3:lambda s: int(s or - 999)}) @@ -444,8 +455,8 @@ class TestLoadTxt(TestCase): assert_array_equal(x, a) def test_converters_with_usecols(self): - c = StringIO() - c.write(asbytes('1,2,3,,5\n6,7,8,9,10\n')) + c = TextIO() + c.write('1,2,3,,5\n6,7,8,9,10\n') c.seek(0) x = np.loadtxt(c, dtype=int, delimiter=',', \ converters={3:lambda s: int(s or - 999)}, \ @@ -454,8 +465,8 @@ class TestLoadTxt(TestCase): assert_array_equal(x, a) def test_comments(self): - c = StringIO() - c.write(asbytes('# comment\n1,2,3,5\n')) + c = TextIO() + c.write('# comment\n1,2,3,5\n') c.seek(0) x = np.loadtxt(c, dtype=int, delimiter=',', \ comments='#') @@ -463,16 +474,16 @@ class TestLoadTxt(TestCase): assert_array_equal(x, a) def test_skiprows(self): - c = StringIO() - c.write(asbytes('comment\n1,2,3,5\n')) + c = TextIO() + c.write('comment\n1,2,3,5\n') c.seek(0) x = np.loadtxt(c, dtype=int, delimiter=',', \ skiprows=1) a = np.array([1, 2, 3, 5], int) assert_array_equal(x, a) - c = StringIO() - c.write(asbytes('# comment\n1,2,3,5\n')) + c = TextIO() + c.write('# comment\n1,2,3,5\n') c.seek(0) x = np.loadtxt(c, dtype=int, delimiter=',', \ skiprows=1) @@ -481,14 +492,14 @@ class TestLoadTxt(TestCase): def test_usecols(self): a = np.array([[1, 2], [3, 4]], float) - c = StringIO() + c = BytesIO() np.savetxt(c, a) c.seek(0) x = np.loadtxt(c, dtype=float, usecols=(1,)) assert_array_equal(x, a[:, 1]) a = np.array([[1, 2, 3], [3, 4, 5]], float) - c = StringIO() + c = BytesIO() np.savetxt(c, a) c.seek(0) x = np.loadtxt(c, dtype=float, usecols=(1, 2)) @@ -503,16 +514,16 @@ class TestLoadTxt(TestCase): data = '''JOE 70.1 25.3 BOB 60.5 27.9 ''' - c = StringIO(data) + c = TextIO(data) names = ['stid', 'temp'] dtypes = ['S4', 'f8'] arr = np.loadtxt(c, usecols=(0, 2), dtype=zip(names, dtypes)) - assert_equal(arr['stid'], asbytes_nested(["JOE", "BOB"])) + assert_equal(arr['stid'], [b"JOE", b"BOB"]) assert_equal(arr['temp'], [25.3, 27.9]) def test_fancy_dtype(self): - c = StringIO() - c.write(asbytes('1,2,3.0\n4,5,6.0\n')) + c = TextIO() + c.write('1,2,3.0\n4,5,6.0\n') c.seek(0) dt = np.dtype([('x', int), ('y', [('t', int), ('s', float)])]) x = np.loadtxt(c, dtype=dt, delimiter=',') @@ -520,7 +531,7 @@ class TestLoadTxt(TestCase): assert_array_equal(x, a) def test_shaped_dtype(self): - c = StringIO("aaaa 1.0 8.0 1 2 3 4 5 6") + c = TextIO("aaaa 1.0 8.0 1 2 3 4 5 6") dt = np.dtype([('name', 'S4'), ('x', float), ('y', float), ('block', int, (2, 3))]) x = np.loadtxt(c, dtype=dt) @@ -529,7 +540,7 @@ class TestLoadTxt(TestCase): assert_array_equal(x, a) def test_3d_shaped_dtype(self): - c = StringIO("aaaa 1.0 8.0 1 2 3 4 5 6 7 8 9 10 11 12") + c = TextIO("aaaa 1.0 8.0 1 2 3 4 5 6 7 8 9 10 11 12") dt = np.dtype([('name', 'S4'), ('x', float), ('y', float), ('block', int, (2, 2, 3))]) x = np.loadtxt(c, dtype=dt) @@ -543,7 +554,7 @@ class TestLoadTxt(TestCase): try: warnings.filterwarnings("ignore", message="loadtxt: Empty input file:") - c = StringIO() + c = TextIO() x = np.loadtxt(c) assert_equal(x.shape, (0,)) x = np.loadtxt(c, dtype=np.int64) @@ -554,8 +565,8 @@ class TestLoadTxt(TestCase): def test_unused_converter(self): - c = StringIO() - c.writelines([asbytes('1 21\n'), asbytes('3 42\n')]) + c = TextIO() + c.writelines(['1 21\n', '3 42\n']) c.seek(0) data = np.loadtxt(c, usecols=(1,), converters={0: lambda s: int(s, 16)}) @@ -570,12 +581,12 @@ class TestLoadTxt(TestCase): "Test using an explicit dtype with an object" from datetime import date import time - data = asbytes(""" 1; 2001-01-01 - 2; 2002-01-31 """) + data = """ 1; 2001-01-01 + 2; 2002-01-31 """ ndtype = [('idx', int), ('code', np.object)] func = lambda s: strptime(s.strip(), "%Y-%m-%d") converters = {1: func} - test = np.loadtxt(StringIO(data), delimiter=";", dtype=ndtype, + test = np.loadtxt(TextIO(data), delimiter=";", dtype=ndtype, converters=converters) control = np.array([(1, datetime(2001, 1, 1)), (2, datetime(2002, 1, 31))], dtype=ndtype) @@ -583,23 +594,23 @@ class TestLoadTxt(TestCase): def test_uint64_type(self): tgt = (9223372043271415339, 9223372043271415853) - c = StringIO() - c.write(asbytes("%s %s" % tgt)) + c = TextIO() + c.write("%s %s" % tgt) c.seek(0) res = np.loadtxt(c, dtype=np.uint64) assert_equal(res, tgt) def test_int64_type(self): tgt = (-9223372036854775807, 9223372036854775807) - c = StringIO() - c.write(asbytes("%s %s" % tgt)) + c = TextIO() + c.write("%s %s" % tgt) c.seek(0) res = np.loadtxt(c, dtype=np.int64) assert_equal(res, tgt) def test_universal_newline(self): f, name = mkstemp() - os.write(f, asbytes('1 21\r3 42\r')) + os.write(f, b'1 21\r3 42\r') os.close(f) try: @@ -609,29 +620,29 @@ class TestLoadTxt(TestCase): os.unlink(name) def test_empty_field_after_tab(self): - c = StringIO() - c.write(asbytes('1 \t2 \t3\tstart \n4\t5\t6\t \n7\t8\t9.5\t')) + c = TextIO() + c.write('1 \t2 \t3\tstart \n4\t5\t6\t \n7\t8\t9.5\t') c.seek(0) dt = { 'names': ('x', 'y', 'z', 'comment'), 'formats': ('<i4', '<i4', '<f4', '|S8')} x = np.loadtxt(c, dtype=dt, delimiter='\t') - a = np.array([asbytes('start '), asbytes(' '), asbytes('')]) + a = np.array([b'start ', b' ', b'']) assert_array_equal(x['comment'], a) def test_structure_unpack(self): - txt = StringIO(asbytes("M 21 72\nF 35 58")) + txt = TextIO("M 21 72\nF 35 58") dt = { 'names': ('a', 'b', 'c'), 'formats': ('|S1', '<i4', '<f4')} a, b, c = np.loadtxt(txt, dtype=dt, unpack=True) assert_(a.dtype.str == '|S1') assert_(b.dtype.str == '<i4') assert_(c.dtype.str == '<f4') - assert_array_equal(a, np.array([asbytes('M'), asbytes('F')])) + assert_array_equal(a, np.array([b'M', b'F'])) assert_array_equal(b, np.array([21, 35])) assert_array_equal(c, np.array([ 72., 58.])) def test_ndmin_keyword(self): - c = StringIO() - c.write(asbytes('1,2,3\n4,5,6')) + c = TextIO() + c.write('1,2,3\n4,5,6') c.seek(0) assert_raises(ValueError, np.loadtxt, c, ndmin=3) c.seek(0) @@ -640,8 +651,9 @@ class TestLoadTxt(TestCase): x = np.loadtxt(c, dtype=int, delimiter=',', ndmin=1) a = np.array([[1, 2, 3], [4, 5, 6]]) assert_array_equal(x, a) - d = StringIO() - d.write(asbytes('0,1,2')) + + d = TextIO() + d.write('0,1,2') d.seek(0) x = np.loadtxt(d, dtype=int, delimiter=',', ndmin=2) assert_(x.shape == (1, 3)) @@ -651,8 +663,9 @@ class TestLoadTxt(TestCase): d.seek(0) x = np.loadtxt(d, dtype=int, delimiter=',', ndmin=0) assert_(x.shape == (3,)) - e = StringIO() - e.write(asbytes('0\n1\n2')) + + e = TextIO() + e.write('0\n1\n2') e.seek(0) x = np.loadtxt(e, dtype=int, delimiter=',', ndmin=2) assert_(x.shape == (3, 1)) @@ -669,7 +682,7 @@ class TestLoadTxt(TestCase): try: warnings.filterwarnings("ignore", message="loadtxt: Empty input file:") - f = StringIO() + f = TextIO() assert_(np.loadtxt(f, ndmin=2).shape == (0, 1,)) assert_(np.loadtxt(f, ndmin=1).shape == (0,)) finally: @@ -678,15 +691,16 @@ class TestLoadTxt(TestCase): def test_generator_source(self): def count(): for i in range(10): - yield asbytes("%d" % i) + yield "%d" % i res = np.loadtxt(count()) assert_array_equal(res, np.arange(10)) class Testfromregex(TestCase): + # np.fromregex expects files opened in binary mode. def test_record(self): - c = StringIO() - c.write(asbytes('1.312 foo\n1.534 bar\n4.444 qux')) + c = TextIO() + c.write('1.312 foo\n1.534 bar\n4.444 qux') c.seek(0) dt = [('num', np.float64), ('val', 'S3')] @@ -696,8 +710,8 @@ class Testfromregex(TestCase): assert_array_equal(x, a) def test_record_2(self): - c = StringIO() - c.write(asbytes('1312 foo\n1534 bar\n4444 qux')) + c = TextIO() + c.write('1312 foo\n1534 bar\n4444 qux') c.seek(0) dt = [('num', np.int32), ('val', 'S3')] @@ -707,8 +721,8 @@ class Testfromregex(TestCase): assert_array_equal(x, a) def test_record_3(self): - c = StringIO() - c.write(asbytes('1312 foo\n1534 bar\n4444 qux')) + c = TextIO() + c.write('1312 foo\n1534 bar\n4444 qux') c.seek(0) dt = [('num', np.float64)] @@ -724,13 +738,13 @@ class TestFromTxt(TestCase): # def test_record(self): "Test w/ explicit dtype" - data = StringIO(asbytes('1 2\n3 4')) + data = TextIO('1 2\n3 4') # data.seek(0) test = np.ndfromtxt(data, dtype=[('x', np.int32), ('y', np.int32)]) control = np.array([(1, 2), (3, 4)], dtype=[('x', 'i4'), ('y', 'i4')]) assert_equal(test, control) # - data = StringIO('M 64.0 75.0\nF 25.0 60.0') + data = TextIO('M 64.0 75.0\nF 25.0 60.0') # data.seek(0) descriptor = {'names': ('gender', 'age', 'weight'), 'formats': ('S1', 'i4', 'f4')} @@ -741,7 +755,7 @@ class TestFromTxt(TestCase): def test_array(self): "Test outputing a standard ndarray" - data = StringIO('1 2\n3 4') + data = TextIO('1 2\n3 4') control = np.array([[1, 2], [3, 4]], dtype=int) test = np.ndfromtxt(data, dtype=int) assert_array_equal(test, control) @@ -755,36 +769,36 @@ class TestFromTxt(TestCase): "Test squeezing to 1D" control = np.array([1, 2, 3, 4], int) # - data = StringIO('1\n2\n3\n4\n') + data = TextIO('1\n2\n3\n4\n') test = np.ndfromtxt(data, dtype=int) assert_array_equal(test, control) # - data = StringIO('1,2,3,4\n') - test = np.ndfromtxt(data, dtype=int, delimiter=asbytes(',')) + data = TextIO('1,2,3,4\n') + test = np.ndfromtxt(data, dtype=int, delimiter=',') assert_array_equal(test, control) def test_comments(self): "Test the stripping of comments" control = np.array([1, 2, 3, 5], int) # Comment on its own line - data = StringIO('# comment\n1,2,3,5\n') - test = np.ndfromtxt(data, dtype=int, delimiter=asbytes(','), comments=asbytes('#')) + data = TextIO('# comment\n1,2,3,5\n') + test = np.ndfromtxt(data, dtype=int, delimiter=',', comments='#') assert_equal(test, control) # Comment at the end of a line - data = StringIO('1,2,3,5# comment\n') - test = np.ndfromtxt(data, dtype=int, delimiter=asbytes(','), comments=asbytes('#')) + data = TextIO('1,2,3,5# comment\n') + test = np.ndfromtxt(data, dtype=int, delimiter=',', comments='#') assert_equal(test, control) def test_skiprows(self): "Test row skipping" control = np.array([1, 2, 3, 5], int) - kwargs = dict(dtype=int, delimiter=asbytes(',')) + kwargs = dict(dtype=int, delimiter=',') # - data = StringIO('comment\n1,2,3,5\n') + data = TextIO('comment\n1,2,3,5\n') test = np.ndfromtxt(data, skip_header=1, **kwargs) assert_equal(test, control) # - data = StringIO('# comment\n1,2,3,5\n') + data = TextIO('# comment\n1,2,3,5\n') test = np.loadtxt(data, skiprows=1, **kwargs) assert_equal(test, control) @@ -794,7 +808,7 @@ class TestFromTxt(TestCase): data.extend(["%i,%3.1f,%03s" % (i, i, i) for i in range(51)]) data[-1] = "99,99" kwargs = dict(delimiter=",", names=True, skip_header=5, skip_footer=10) - test = np.genfromtxt(StringIO(asbytes("\n".join(data))), **kwargs) + test = np.genfromtxt(TextIO("\n".join(data)), **kwargs) ctrl = np.array([("%f" % i, "%f" % i, "%f" % i) for i in range(41)], dtype=[(_, float) for _ in "ABC"]) assert_equal(test, ctrl) @@ -807,19 +821,19 @@ class TestFromTxt(TestCase): warnings.filterwarnings("ignore") # Footer too small to get rid of all invalid values assert_raises(ValueError, np.genfromtxt, - StringIO(basestr), skip_footer=1) + TextIO(basestr), skip_footer=1) # except ValueError: # pass - a = np.genfromtxt(StringIO(basestr), skip_footer=1, invalid_raise=False) + a = np.genfromtxt(TextIO(basestr), skip_footer=1, invalid_raise=False) assert_equal(a, np.array([[1., 1.], [2., 2.], [3., 3.], [4., 4.]])) # - a = np.genfromtxt(StringIO(basestr), skip_footer=3) + a = np.genfromtxt(TextIO(basestr), skip_footer=3) assert_equal(a, np.array([[1., 1.], [2., 2.], [3., 3.], [4., 4.]])) # basestr = '1 1\n2 \n3 3\n4 4\n5 \n6 6\n7 7\n' - a = np.genfromtxt(StringIO(basestr), skip_footer=1, invalid_raise=False) + a = np.genfromtxt(TextIO(basestr), skip_footer=1, invalid_raise=False) assert_equal(a, np.array([[1., 1.], [3., 3.], [4., 4.], [6., 6.]])) - a = np.genfromtxt(StringIO(basestr), skip_footer=3, invalid_raise=False) + a = np.genfromtxt(TextIO(basestr), skip_footer=3, invalid_raise=False) assert_equal(a, np.array([[1., 1.], [3., 3.], [4., 4.]])) finally: warn_ctx.__exit__() @@ -827,9 +841,9 @@ class TestFromTxt(TestCase): def test_header(self): "Test retrieving a header" - data = StringIO('gender age weight\nM 64.0 75.0\nF 25.0 60.0') + data = TextIO('gender age weight\nM 64.0 75.0\nF 25.0 60.0') test = np.ndfromtxt(data, dtype=None, names=True) - control = {'gender': np.array(asbytes_nested(['M', 'F'])), + control = {'gender': np.array([b'M', b'F']), 'age': np.array([64.0, 25.0]), 'weight': np.array([75.0, 60.0])} assert_equal(test['gender'], control['gender']) @@ -838,9 +852,9 @@ class TestFromTxt(TestCase): def test_auto_dtype(self): "Test the automatic definition of the output dtype" - data = StringIO('A 64 75.0 3+4j True\nBCD 25 60.0 5+6j False') + data = TextIO('A 64 75.0 3+4j True\nBCD 25 60.0 5+6j False') test = np.ndfromtxt(data, dtype=None) - control = [np.array(asbytes_nested(['A', 'BCD'])), + control = [np.array([b'A', b'BCD']), np.array([64, 25]), np.array([75.0, 60.0]), np.array([3 + 4j, 5 + 6j]), @@ -852,7 +866,7 @@ class TestFromTxt(TestCase): def test_auto_dtype_uniform(self): "Tests whether the output dtype can be uniformized" - data = StringIO('1 2 3 4\n5 6 7 8\n') + data = TextIO('1 2 3 4\n5 6 7 8\n') test = np.ndfromtxt(data, dtype=None) control = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) assert_equal(test, control) @@ -860,7 +874,7 @@ class TestFromTxt(TestCase): def test_fancy_dtype(self): "Check that a nested dtype isn't MIA" - data = StringIO('1,2,3.0\n4,5,6.0\n') + data = TextIO('1,2,3.0\n4,5,6.0\n') fancydtype = np.dtype([('x', int), ('y', [('t', int), ('s', float)])]) test = np.ndfromtxt(data, dtype=fancydtype, delimiter=',') control = np.array([(1, (2, 3.0)), (4, (5, 6.0))], dtype=fancydtype) @@ -871,7 +885,7 @@ class TestFromTxt(TestCase): "Test overwriting the names of the dtype" descriptor = {'names': ('g', 'a', 'w'), 'formats': ('S1', 'i4', 'f4')} - data = StringIO('M 64.0 75.0\nF 25.0 60.0') + data = TextIO(b'M 64.0 75.0\nF 25.0 60.0') names = ('gender', 'age', 'weight') test = np.ndfromtxt(data, dtype=descriptor, names=names) descriptor['names'] = names @@ -882,7 +896,7 @@ class TestFromTxt(TestCase): def test_commented_header(self): "Check that names can be retrieved even if the line is commented out." - data = StringIO(""" + data = TextIO(""" #gender age weight M 21 72.100000 F 35 58.330000 @@ -894,7 +908,7 @@ M 33 21.99 dtype=[('gender', '|S1'), ('age', int), ('weight', float)]) assert_equal(test, ctrl) # Ditto, but we should get rid of the first element - data = StringIO(""" + data = TextIO(b""" # gender age weight M 21 72.100000 F 35 58.330000 @@ -906,7 +920,7 @@ M 33 21.99 def test_autonames_and_usecols(self): "Tests names and usecols" - data = StringIO('A B C D\n aaaa 121 45 9.1') + data = TextIO('A B C D\n aaaa 121 45 9.1') test = np.ndfromtxt(data, usecols=('A', 'C', 'D'), names=True, dtype=None) control = np.array(('aaaa', 45, 9.1), @@ -916,7 +930,7 @@ M 33 21.99 def test_converters_with_usecols(self): "Test the combination user-defined converters and usecol" - data = StringIO('1,2,3,,5\n6,7,8,9,10\n') + data = TextIO('1,2,3,,5\n6,7,8,9,10\n') test = np.ndfromtxt(data, dtype=int, delimiter=',', converters={3:lambda s: int(s or - 999)}, usecols=(1, 3,)) @@ -925,7 +939,7 @@ M 33 21.99 def test_converters_with_usecols_and_names(self): "Tests names and usecols" - data = StringIO('A B C D\n aaaa 121 45 9.1') + data = TextIO('A B C D\n aaaa 121 45 9.1') test = np.ndfromtxt(data, usecols=('A', 'C', 'D'), names=True, dtype=None, converters={'C':lambda s: 2 * int(s)}) control = np.array(('aaaa', 90, 9.1), @@ -935,26 +949,26 @@ M 33 21.99 def test_converters_cornercases(self): "Test the conversion to datetime." converter = {'date': lambda s: strptime(s, '%Y-%m-%d %H:%M:%SZ')} - data = StringIO('2009-02-03 12:00:00Z, 72214.0') + data = TextIO('2009-02-03 12:00:00Z, 72214.0') test = np.ndfromtxt(data, delimiter=',', dtype=None, names=['date', 'stid'], converters=converter) - control = np.array((datetime(2009, 02, 03), 72214.), + control = np.array((datetime(2009, 2, 3), 72214.), dtype=[('date', np.object_), ('stid', float)]) assert_equal(test, control) def test_converters_cornercases2(self): "Test the conversion to datetime64." converter = {'date': lambda s: np.datetime64(strptime(s, '%Y-%m-%d %H:%M:%SZ'))} - data = StringIO('2009-02-03 12:00:00Z, 72214.0') + data = TextIO('2009-02-03 12:00:00Z, 72214.0') test = np.ndfromtxt(data, delimiter=',', dtype=None, names=['date', 'stid'], converters=converter) - control = np.array((datetime(2009, 02, 03), 72214.), + control = np.array((datetime(2009, 2, 3), 72214.), dtype=[('date', 'datetime64[us]'), ('stid', float)]) assert_equal(test, control) def test_unused_converter(self): "Test whether unused converters are forgotten" - data = StringIO("1 21\n 3 42\n") + data = TextIO("1 21\n 3 42\n") test = np.ndfromtxt(data, usecols=(1,), converters={0: lambda s: int(s, 16)}) assert_equal(test, [21, 42]) @@ -966,11 +980,11 @@ M 33 21.99 def test_invalid_converter(self): - strip_rand = lambda x : float((asbytes('r') in x.lower() and x.split()[-1]) or - (not asbytes('r') in x.lower() and x.strip() or 0.0)) - strip_per = lambda x : float((asbytes('%') in x.lower() and x.split()[0]) or - (not asbytes('%') in x.lower() and x.strip() or 0.0)) - s = StringIO("D01N01,10/1/2003 ,1 %,R 75,400,600\r\n" \ + strip_rand = lambda x : float((b'r' in x.lower() and x.split()[-1]) or + (b'r' not in x.lower() and x.strip() or 0.0)) + strip_per = lambda x : float((b'%' in x.lower() and x.split()[0]) or + (b'%' not in x.lower() and x.strip() or 0.0)) + s = TextIO("D01N01,10/1/2003 ,1 %,R 75,400,600\r\n" "L24U05,12/5/2003, 2 %,1,300, 150.5\r\n" "D02N03,10/10/2004,R 1,,7,145.55") kwargs = dict(converters={2 : strip_per, 3 : strip_rand}, delimiter=",", @@ -979,7 +993,7 @@ M 33 21.99 def test_tricky_converter_bug1666(self): "Test some corner case" - s = StringIO('q1,2\nq3,4') + s = TextIO('q1,2\nq3,4') cnv = lambda s:float(s[1:]) test = np.genfromtxt(s, delimiter=',', converters={0:cnv}) control = np.array([[1., 2.], [3., 4.]]) @@ -989,12 +1003,12 @@ M 33 21.99 def test_dtype_with_converters(self): dstr = "2009; 23; 46" - test = np.ndfromtxt(StringIO(dstr,), + test = np.ndfromtxt(TextIO(dstr,), delimiter=";", dtype=float, converters={0:bytes}) control = np.array([('2009', 23., 46)], dtype=[('f0', '|S4'), ('f1', float), ('f2', float)]) assert_equal(test, control) - test = np.ndfromtxt(StringIO(dstr,), + test = np.ndfromtxt(TextIO(dstr,), delimiter=";", dtype=float, converters={0:float}) control = np.array([2009., 23., 46],) assert_equal(test, control) @@ -1004,12 +1018,12 @@ M 33 21.99 "Test using an explicit dtype with an object" from datetime import date import time - data = asbytes(""" 1; 2001-01-01 - 2; 2002-01-31 """) + data = """ 1; 2001-01-01 + 2; 2002-01-31 """ ndtype = [('idx', int), ('code', np.object)] func = lambda s: strptime(s.strip(), "%Y-%m-%d") converters = {1: func} - test = np.genfromtxt(StringIO(data), delimiter=";", dtype=ndtype, + test = np.genfromtxt(TextIO(data), delimiter=";", dtype=ndtype, converters=converters) control = np.array([(1, datetime(2001, 1, 1)), (2, datetime(2002, 1, 31))], dtype=ndtype) @@ -1017,7 +1031,7 @@ M 33 21.99 # ndtype = [('nest', [('idx', int), ('code', np.object)])] try: - test = np.genfromtxt(StringIO(data), delimiter=";", + test = np.genfromtxt(TextIO(data), delimiter=";", dtype=ndtype, converters=converters) except NotImplementedError: pass @@ -1028,7 +1042,7 @@ M 33 21.99 def test_userconverters_with_explicit_dtype(self): "Test user_converters w/ explicit (standard) dtype" - data = StringIO('skip,skip,2001-01-01,1.0,skip') + data = TextIO('skip,skip,2001-01-01,1.0,skip') test = np.genfromtxt(data, delimiter=",", names=None, dtype=float, usecols=(2, 3), converters={2: bytes}) control = np.array([('2001-01-01', 1.)], @@ -1038,7 +1052,7 @@ M 33 21.99 def test_spacedelimiter(self): "Test space delimiter" - data = StringIO("1 2 3 4 5\n6 7 8 9 10") + data = TextIO("1 2 3 4 5\n6 7 8 9 10") test = np.ndfromtxt(data) control = np.array([[ 1., 2., 3., 4., 5.], [ 6., 7., 8., 9., 10.]]) @@ -1047,13 +1061,13 @@ M 33 21.99 def test_integer_delimiter(self): "Test using an integer for delimiter" data = " 1 2 3\n 4 5 67\n890123 4" - test = np.genfromtxt(StringIO(data), delimiter=3) + test = np.genfromtxt(TextIO(data), delimiter=3) control = np.array([[1, 2, 3], [4, 5, 67], [890, 123, 4]]) assert_equal(test, control) def test_missing(self): - data = StringIO('1,2,3,,5\n') + data = TextIO('1,2,3,,5\n') test = np.ndfromtxt(data, dtype=int, delimiter=',', \ converters={3:lambda s: int(s or - 999)}) control = np.array([1, 2, 3, -999, 5], int) @@ -1063,7 +1077,7 @@ M 33 21.99 def test_missing_with_tabs(self): "Test w/ a delimiter tab" txt = "1\t2\t3\n\t2\t\n1\t\t3" - test = np.genfromtxt(StringIO(txt), delimiter="\t", + test = np.genfromtxt(TextIO(txt), delimiter="\t", usemask=True,) ctrl_d = np.array([(1, 2, 3), (np.nan, 2, np.nan), (1, np.nan, 3)],) ctrl_m = np.array([(0, 0, 0), (1, 0, 1), (0, 1, 0)], dtype=bool) @@ -1075,14 +1089,14 @@ M 33 21.99 "Test the selection of columns" # Select 1 column control = np.array([[1, 2], [3, 4]], float) - data = StringIO() + data = TextIO() np.savetxt(data, control) data.seek(0) test = np.ndfromtxt(data, dtype=float, usecols=(1,)) assert_equal(test, control[:, 1]) # control = np.array([[1, 2, 3], [3, 4, 5]], float) - data = StringIO() + data = TextIO() np.savetxt(data, control) data.seek(0) test = np.ndfromtxt(data, dtype=float, usecols=(1, 2)) @@ -1095,23 +1109,23 @@ M 33 21.99 def test_usecols_as_css(self): "Test giving usecols with a comma-separated string" data = "1 2 3\n4 5 6" - test = np.genfromtxt(StringIO(data), + test = np.genfromtxt(TextIO(data), names="a, b, c", usecols="a, c") ctrl = np.array([(1, 3), (4, 6)], dtype=[(_, float) for _ in "ac"]) assert_equal(test, ctrl) def test_usecols_with_structured_dtype(self): "Test usecols with an explicit structured dtype" - data = StringIO("""JOE 70.1 25.3\nBOB 60.5 27.9""") + data = TextIO("JOE 70.1 25.3\nBOB 60.5 27.9") names = ['stid', 'temp'] dtypes = ['S4', 'f8'] test = np.ndfromtxt(data, usecols=(0, 2), dtype=zip(names, dtypes)) - assert_equal(test['stid'], asbytes_nested(["JOE", "BOB"])) + assert_equal(test['stid'], [b"JOE", b"BOB"]) assert_equal(test['temp'], [25.3, 27.9]) def test_usecols_with_integer(self): "Test usecols with an integer" - test = np.genfromtxt(StringIO("1 2 3\n4 5 6"), usecols=0) + test = np.genfromtxt(TextIO(b"1 2 3\n4 5 6"), usecols=0) assert_equal(test, np.array([1., 4.])) def test_usecols_with_named_columns(self): @@ -1119,9 +1133,9 @@ M 33 21.99 ctrl = np.array([(1, 3), (4, 6)], dtype=[('a', float), ('c', float)]) data = "1 2 3\n4 5 6" kwargs = dict(names="a, b, c") - test = np.genfromtxt(StringIO(data), usecols=(0, -1), **kwargs) + test = np.genfromtxt(TextIO(data), usecols=(0, -1), **kwargs) assert_equal(test, ctrl) - test = np.genfromtxt(StringIO(data), + test = np.genfromtxt(TextIO(data), usecols=('a', 'c'), **kwargs) assert_equal(test, ctrl) @@ -1131,7 +1145,7 @@ M 33 21.99 warn_ctx.__enter__() try: warnings.filterwarnings("ignore", message="genfromtxt: Empty input file:") - data = StringIO() + data = TextIO() test = np.genfromtxt(data) assert_equal(test, np.array([])) finally: @@ -1139,7 +1153,7 @@ M 33 21.99 def test_fancy_dtype_alt(self): "Check that a nested dtype isn't MIA" - data = StringIO('1,2,3.0\n4,5,6.0\n') + data = TextIO('1,2,3.0\n4,5,6.0\n') fancydtype = np.dtype([('x', int), ('y', [('t', int), ('s', float)])]) test = np.mafromtxt(data, dtype=fancydtype, delimiter=',') control = ma.array([(1, (2, 3.0)), (4, (5, 6.0))], dtype=fancydtype) @@ -1147,7 +1161,7 @@ M 33 21.99 def test_shaped_dtype(self): - c = StringIO("aaaa 1.0 8.0 1 2 3 4 5 6") + c = TextIO("aaaa 1.0 8.0 1 2 3 4 5 6") dt = np.dtype([('name', 'S4'), ('x', float), ('y', float), ('block', int, (2, 3))]) x = np.ndfromtxt(c, dtype=dt) @@ -1156,7 +1170,7 @@ M 33 21.99 assert_array_equal(x, a) def test_withmissing(self): - data = StringIO('A,B\n0,1\n2,N/A') + data = TextIO('A,B\n0,1\n2,N/A') kwargs = dict(delimiter=",", missing_values="N/A", names=True) test = np.mafromtxt(data, dtype=None, **kwargs) control = ma.array([(0, 1), (2, -1)], @@ -1179,7 +1193,7 @@ M 33 21.99 basekwargs = dict(dtype=None, delimiter=",", names=True,) mdtype = [('A', int), ('B', float), ('C', complex)] # - test = np.mafromtxt(StringIO(data), missing_values="N/A", + test = np.mafromtxt(TextIO(data), missing_values="N/A", **basekwargs) control = ma.array([(0, 0.0, 0j), (1, -999, 1j), (-9, 2.2, -999j), (3, -99, 3j)], @@ -1188,7 +1202,7 @@ M 33 21.99 assert_equal(test, control) # basekwargs['dtype'] = mdtype - test = np.mafromtxt(StringIO(data), + test = np.mafromtxt(TextIO(data), missing_values={0:-9, 1:-99, 2:-999j}, **basekwargs) control = ma.array([(0, 0.0, 0j), (1, -999, 1j), (-9, 2.2, -999j), (3, -99, 3j)], @@ -1196,7 +1210,7 @@ M 33 21.99 dtype=mdtype) assert_equal(test, control) # - test = np.mafromtxt(StringIO(data), + test = np.mafromtxt(TextIO(data), missing_values={0:-9, 'B':-99, 'C':-999j}, **basekwargs) control = ma.array([(0, 0.0, 0j), (1, -999, 1j), @@ -1214,18 +1228,18 @@ M 33 21.99 names="a,b,c", missing_values={0:"N/A", 'b':" ", 2:"???"}, filling_values={0:0, 'b':0, 2:-999}) - test = np.genfromtxt(StringIO(data), **kwargs) + test = np.genfromtxt(TextIO(data), **kwargs) ctrl = np.array([(0, 2, 3), (4, 0, -999)], dtype=[(_, int) for _ in "abc"]) assert_equal(test, ctrl) # - test = np.genfromtxt(StringIO(data), usecols=(0, -1), **kwargs) + test = np.genfromtxt(TextIO(data), usecols=(0, -1), **kwargs) ctrl = np.array([(0, 3), (4, -999)], dtype=[(_, int) for _ in "ac"]) assert_equal(test, ctrl) def test_withmissing_float(self): - data = StringIO('A,B\n0,1.5\n2,-999.00') + data = TextIO('A,B\n0,1.5\n2,-999.00') test = np.mafromtxt(data, dtype=None, delimiter=',', missing_values='-999.0', names=True,) control = ma.array([(0, 1.5), (2, -1.)], @@ -1237,7 +1251,7 @@ M 33 21.99 def test_with_masked_column_uniform(self): "Test masked column" - data = StringIO('1 2 3\n4 5 6\n') + data = TextIO('1 2 3\n4 5 6\n') test = np.genfromtxt(data, dtype=None, missing_values='2,5', usemask=True) control = ma.array([[1, 2, 3], [4, 5, 6]], mask=[[0, 1, 0], [0, 1, 0]]) @@ -1245,7 +1259,7 @@ M 33 21.99 def test_with_masked_column_various(self): "Test masked column" - data = StringIO('True 2 3\nFalse 5 6\n') + data = TextIO('True 2 3\nFalse 5 6\n') test = np.genfromtxt(data, dtype=None, missing_values='2,5', usemask=True) control = ma.array([(1, 2, 3), (0, 5, 6)], @@ -1260,7 +1274,7 @@ M 33 21.99 for i in range(5): data[10 * i] = "2, 2, 2, 2 2" data.insert(0, "a, b, c, d, e") - mdata = StringIO("\n".join(data)) + mdata = TextIO("\n".join(data)) # kwargs = dict(delimiter=",", dtype=None, names=True) # XXX: is there a better way to get the return value of the callable in @@ -1283,7 +1297,7 @@ M 33 21.99 for i in range(5): data[10 * i] = "2, 2, 2, 2 2" data.insert(0, "a, b, c, d, e") - mdata = StringIO("\n".join(data)) + mdata = TextIO("\n".join(data)) kwargs = dict(delimiter=",", dtype=None, names=True, invalid_raise=False) # XXX: is there a better way to get the return value of the callable in @@ -1307,7 +1321,7 @@ M 33 21.99 def test_inconsistent_dtype(self): "Test inconsistent dtype" data = ["1, 1, 1, 1, -1.1"] * 50 - mdata = StringIO("\n".join(data)) + mdata = TextIO("\n".join(data)) converters = {4: lambda x:"(%s)" % x} kwargs = dict(delimiter=",", converters=converters, @@ -1318,7 +1332,7 @@ M 33 21.99 def test_default_field_format(self): "Test default format" data = "0, 1, 2.3\n4, 5, 6.7" - mtest = np.ndfromtxt(StringIO(data), + mtest = np.ndfromtxt(TextIO(data), delimiter=",", dtype=None, defaultfmt="f%02i") ctrl = np.array([(0, 1, 2.3), (4, 5, 6.7)], dtype=[("f00", int), ("f01", int), ("f02", float)]) @@ -1327,7 +1341,7 @@ M 33 21.99 def test_single_dtype_wo_names(self): "Test single dtype w/o names" data = "0, 1, 2.3\n4, 5, 6.7" - mtest = np.ndfromtxt(StringIO(data), + mtest = np.ndfromtxt(TextIO(data), delimiter=",", dtype=float, defaultfmt="f%02i") ctrl = np.array([[0., 1., 2.3], [4., 5., 6.7]], dtype=float) assert_equal(mtest, ctrl) @@ -1335,7 +1349,7 @@ M 33 21.99 def test_single_dtype_w_explicit_names(self): "Test single dtype w explicit names" data = "0, 1, 2.3\n4, 5, 6.7" - mtest = np.ndfromtxt(StringIO(data), + mtest = np.ndfromtxt(TextIO(data), delimiter=",", dtype=float, names="a, b, c") ctrl = np.array([(0., 1., 2.3), (4., 5., 6.7)], dtype=[(_, float) for _ in "abc"]) @@ -1344,7 +1358,7 @@ M 33 21.99 def test_single_dtype_w_implicit_names(self): "Test single dtype w implicit names" data = "a, b, c\n0, 1, 2.3\n4, 5, 6.7" - mtest = np.ndfromtxt(StringIO(data), + mtest = np.ndfromtxt(TextIO(data), delimiter=",", dtype=float, names=True) ctrl = np.array([(0., 1., 2.3), (4., 5., 6.7)], dtype=[(_, float) for _ in "abc"]) @@ -1353,7 +1367,7 @@ M 33 21.99 def test_easy_structured_dtype(self): "Test easy structured dtype" data = "0, 1, 2.3\n4, 5, 6.7" - mtest = np.ndfromtxt(StringIO(data), delimiter=",", + mtest = np.ndfromtxt(TextIO(data), delimiter=",", dtype=(int, float, float), defaultfmt="f_%02i") ctrl = np.array([(0, 1., 2.3), (4, 5., 6.7)], dtype=[("f_00", int), ("f_01", float), ("f_02", float)]) @@ -1363,11 +1377,11 @@ M 33 21.99 "Test autostrip" data = "01/01/2003 , 1.3, abcde" kwargs = dict(delimiter=",", dtype=None) - mtest = np.ndfromtxt(StringIO(data), **kwargs) + mtest = np.ndfromtxt(TextIO(data), **kwargs) ctrl = np.array([('01/01/2003 ', 1.3, ' abcde')], dtype=[('f0', '|S12'), ('f1', float), ('f2', '|S8')]) assert_equal(mtest, ctrl) - mtest = np.ndfromtxt(StringIO(data), autostrip=True, **kwargs) + mtest = np.ndfromtxt(TextIO(data), autostrip=True, **kwargs) ctrl = np.array([('01/01/2003', 1.3, 'abcde')], dtype=[('f0', '|S10'), ('f1', float), ('f2', '|S5')]) assert_equal(mtest, ctrl) @@ -1376,20 +1390,20 @@ M 33 21.99 "Test the 'replace_space' option" txt = "A.A, B (B), C:C\n1, 2, 3.14" # Test default: replace ' ' by '_' and delete non-alphanum chars - test = np.genfromtxt(StringIO(txt), + test = np.genfromtxt(TextIO(txt), delimiter=",", names=True, dtype=None) ctrl_dtype = [("AA", int), ("B_B", int), ("CC", float)] ctrl = np.array((1, 2, 3.14), dtype=ctrl_dtype) assert_equal(test, ctrl) # Test: no replace, no delete - test = np.genfromtxt(StringIO(txt), + test = np.genfromtxt(TextIO(txt), delimiter=",", names=True, dtype=None, replace_space='', deletechars='') ctrl_dtype = [("A.A", int), ("B (B)", int), ("C:C", float)] ctrl = np.array((1, 2, 3.14), dtype=ctrl_dtype) assert_equal(test, ctrl) # Test: no delete (spaces are replaced by _) - test = np.genfromtxt(StringIO(txt), + test = np.genfromtxt(TextIO(txt), delimiter=",", names=True, dtype=None, deletechars='') ctrl_dtype = [("A.A", int), ("B_(B)", int), ("C:C", float)] @@ -1403,17 +1417,17 @@ M 33 21.99 # w/ dtype=None ctrl = np.array([(0, 1, 2), (3, 4, 5)], dtype=[(_, int) for _ in ('A', 'f0', 'C')]) - test = np.ndfromtxt(StringIO(data), dtype=None, **kwargs) + test = np.ndfromtxt(TextIO(data), dtype=None, **kwargs) assert_equal(test, ctrl) # w/ default dtype ctrl = np.array([(0, 1, 2), (3, 4, 5)], dtype=[(_, float) for _ in ('A', 'f0', 'C')]) - test = np.ndfromtxt(StringIO(data), **kwargs) + test = np.ndfromtxt(TextIO(data), **kwargs) def test_names_auto_completion(self): "Make sure that names are properly completed" data = "1 2 3\n 4 5 6" - test = np.genfromtxt(StringIO(data), + test = np.genfromtxt(TextIO(data), dtype=(int, float, int), names="a") ctrl = np.array([(1, 2, 3), (4, 5, 6)], dtype=[('a', int), ('f0', float), ('f1', int)]) @@ -1423,17 +1437,17 @@ M 33 21.99 "Make sure we pick up the right names w/ usecols" data = "A,B,C,D,E\n0,1,2,3,4\n0,1,2,3,4\n0,1,2,3,4" ctrl_names = ("A", "C", "E") - test = np.genfromtxt(StringIO(data), + test = np.genfromtxt(TextIO(data), dtype=(int, int, int), delimiter=",", usecols=(0, 2, 4), names=True) assert_equal(test.dtype.names, ctrl_names) # - test = np.genfromtxt(StringIO(data), + test = np.genfromtxt(TextIO(data), dtype=(int, int, int), delimiter=",", usecols=("A", "C", "E"), names=True) assert_equal(test.dtype.names, ctrl_names) # - test = np.genfromtxt(StringIO(data), + test = np.genfromtxt(TextIO(data), dtype=int, delimiter=",", usecols=("A", "C", "E"), names=True) assert_equal(test.dtype.names, ctrl_names) @@ -1444,35 +1458,35 @@ M 33 21.99 kwargs = dict(delimiter=(5, 5, 4), names=True, dtype=None) ctrl = np.array([(0, 1, 2.3), (45, 67, 9.)], dtype=[('A', int), ('B', int), ('C', float)]) - test = np.ndfromtxt(StringIO(data), **kwargs) + test = np.ndfromtxt(TextIO(data), **kwargs) assert_equal(test, ctrl) # kwargs = dict(delimiter=5, names=True, dtype=None) ctrl = np.array([(0, 1, 2.3), (45, 67, 9.)], dtype=[('A', int), ('B', int), ('C', float)]) - test = np.ndfromtxt(StringIO(data), **kwargs) + test = np.ndfromtxt(TextIO(data), **kwargs) assert_equal(test, ctrl) def test_filling_values(self): "Test missing values" - data = "1, 2, 3\n1, , 5\n0, 6, \n" + data = b"1, 2, 3\n1, , 5\n0, 6, \n" kwargs = dict(delimiter=",", dtype=None, filling_values= -999) ctrl = np.array([[1, 2, 3], [1, -999, 5], [0, 6, -999]], dtype=int) - test = np.ndfromtxt(StringIO(data), **kwargs) + test = np.ndfromtxt(TextIO(data), **kwargs) assert_equal(test, ctrl) def test_comments_is_none(self): # Github issue 329 (None was previously being converted to 'None'). - test = np.genfromtxt(StringIO("test1,testNonetherestofthedata"), + test = np.genfromtxt(TextIO("test1,testNonetherestofthedata"), dtype=None, comments=None, delimiter=',') - assert_equal(test[1], asbytes('testNonetherestofthedata')) - test = np.genfromtxt(StringIO("test1, testNonetherestofthedata"), + assert_equal(test[1], b'testNonetherestofthedata') + test = np.genfromtxt(TextIO("test1, testNonetherestofthedata"), dtype=None, comments=None, delimiter=',') - assert_equal(test[1], asbytes(' testNonetherestofthedata')) + assert_equal(test[1], b' testNonetherestofthedata') def test_recfromtxt(self): # - data = StringIO('A,B\n0,1\n2,3') + data = TextIO('A,B\n0,1\n2,3') kwargs = dict(delimiter=",", missing_values="N/A", names=True) test = np.recfromtxt(data, **kwargs) control = np.array([(0, 1), (2, 3)], @@ -1480,7 +1494,7 @@ M 33 21.99 self.assertTrue(isinstance(test, np.recarray)) assert_equal(test, control) # - data = StringIO('A,B\n0,1\n2,N/A') + data = TextIO('A,B\n0,1\n2,N/A') test = np.recfromtxt(data, dtype=None, usemask=True, **kwargs) control = ma.array([(0, 1), (2, -1)], mask=[(False, False), (False, True)], @@ -1491,7 +1505,7 @@ M 33 21.99 def test_recfromcsv(self): # - data = StringIO('A,B\n0,1\n2,3') + data = TextIO('A,B\n0,1\n2,3') kwargs = dict(missing_values="N/A", names=True, case_sensitive=True) test = np.recfromcsv(data, dtype=None, **kwargs) control = np.array([(0, 1), (2, 3)], @@ -1499,7 +1513,7 @@ M 33 21.99 self.assertTrue(isinstance(test, np.recarray)) assert_equal(test, control) # - data = StringIO('A,B\n0,1\n2,N/A') + data = TextIO('A,B\n0,1\n2,N/A') test = np.recfromcsv(data, dtype=None, usemask=True, **kwargs) control = ma.array([(0, 1), (2, -1)], mask=[(False, False), (False, True)], @@ -1508,7 +1522,7 @@ M 33 21.99 assert_equal(test.mask, control.mask) assert_equal(test.A, [0, 2]) # - data = StringIO('A,B\n0,1\n2,3') + data = TextIO('A,B\n0,1\n2,3') test = np.recfromcsv(data, missing_values='N/A',) control = np.array([(0, 1), (2, 3)], dtype=[('a', np.int), ('b', np.int)]) @@ -1537,6 +1551,7 @@ M 33 21.99 os.unlink(name) def test_gft_using_generator(self): + # gft doesn't work with unicode. def count(): for i in range(10): yield asbytes("%d" % i) @@ -1548,7 +1563,7 @@ M 33 21.99 def test_gzip_load(): a = np.random.random((5, 5)) - s = StringIO() + s = BytesIO() f = gzip.GzipFile(fileobj=s, mode="w") np.save(f, a) @@ -1565,9 +1580,9 @@ def test_gzip_loadtxt(): # reopened by another open call. So we first put the gzipped string # of the test reference array, write it to a securely opened file, # which is then read from by the loadtxt function - s = StringIO() + s = BytesIO() g = gzip.GzipFile(fileobj=s, mode='w') - g.write(asbytes('1 2 3\n')) + g.write(b'1 2 3\n') g.close() s.seek(0) @@ -1581,9 +1596,9 @@ def test_gzip_loadtxt(): os.unlink(name) def test_gzip_loadtxt_from_string(): - s = StringIO() + s = BytesIO() f = gzip.GzipFile(fileobj=s, mode="w") - f.write(asbytes('1 2 3\n')) + f.write(b'1 2 3\n') f.close() s.seek(0) @@ -1591,7 +1606,7 @@ def test_gzip_loadtxt_from_string(): assert_array_equal(np.loadtxt(f), [1, 2, 3]) def test_npzfile_dict(): - s = StringIO() + s = BytesIO() x = np.zeros((3, 3)) y = np.zeros((3, 3)) @@ -1620,7 +1635,7 @@ def test_load_refcount(): # Check that objects returned by np.load are directly freed based on # their refcount, rather than needing the gc to collect them. - f = StringIO() + f = BytesIO() np.savez(f, [1, 2, 3]) f.seek(0) diff --git a/numpy/lib/tests/test_regression.py b/numpy/lib/tests/test_regression.py index 9e303d2b1..2e76b320c 100644 --- a/numpy/lib/tests/test_regression.py +++ b/numpy/lib/tests/test_regression.py @@ -1,5 +1,6 @@ from __future__ import division, absolute_import +import sys from numpy.testing import * from numpy.testing.utils import _assert_valid_refcount import numpy as np @@ -202,7 +203,11 @@ class TestRegression(TestCase): def test_loadtxt_fields_subarrays(self): # For ticket #1936 - from StringIO import StringIO + if sys.version_info[0] >= 3: + from io import StringIO + else: + from StringIO import StringIO + dt = [("a", 'u1', 2), ("b", 'u1', 2)] x = np.loadtxt(StringIO("0 1 2 3"), dtype=dt) assert_equal(x, np.array([((0, 1), (2, 3))], dtype=dt)) diff --git a/numpy/lib/tests/test_utils.py b/numpy/lib/tests/test_utils.py index 4b386e0b1..8cec1887b 100644 --- a/numpy/lib/tests/test_utils.py +++ b/numpy/lib/tests/test_utils.py @@ -1,10 +1,14 @@ from __future__ import division, absolute_import +import sys from numpy.testing import * import numpy.lib.utils as utils from numpy.lib import deprecate -from StringIO import StringIO +if sys.version_info[0] >= 3: + from io import StringIO +else: + from StringIO import StringIO def test_lookfor(): out = StringIO() diff --git a/numpy/lib/utils.py b/numpy/lib/utils.py index ee49b41d6..c4b692a69 100644 --- a/numpy/lib/utils.py +++ b/numpy/lib/utils.py @@ -848,7 +848,12 @@ def _lookfor_generate_cache(module, import_modules, regenerate): global _lookfor_caches # Local import to speed up numpy's import time. import inspect - from cStringIO import StringIO + + if sys.version_info[0] >= 3: + # In Python3 stderr, stdout are text files. + from io import StringIO + else: + from StringIO import StringIO if module is None: module = "numpy" diff --git a/numpy/linalg/lapack_lite/clapack_scrub.py b/numpy/linalg/lapack_lite/clapack_scrub.py index 22f818e91..e6ac43e31 100644 --- a/numpy/linalg/lapack_lite/clapack_scrub.py +++ b/numpy/linalg/lapack_lite/clapack_scrub.py @@ -1,8 +1,8 @@ -#!/usr/bin/env python2.4 +#!/usr/bin/env python from __future__ import division, absolute_import import sys, os -from cStringIO import StringIO +from io import StringIO import re from Plex import * diff --git a/numpy/ma/core.py b/numpy/ma/core.py index 3c7206e1c..64cfafe7c 100644 --- a/numpy/ma/core.py +++ b/numpy/ma/core.py @@ -22,6 +22,23 @@ Released for unlimited redistribution. # pylint: disable-msg=E1002 from __future__ import division, absolute_import +import sys +import warnings + +import numpy as np +import numpy.core.umath as umath +import numpy.core.numerictypes as ntypes +from numpy import ndarray, amax, amin, iscomplexobj, bool_ +from numpy import array as narray +from numpy.lib.function_base import angle +from numpy.compat import getargspec, formatargspec +from numpy import expand_dims as n_expand_dims + +if sys.version_info[0] >= 3: + from functools import reduce + import pickle +else: + import cPickle as pickle __author__ = "Pierre GF Gerard-Marchant" __docformat__ = "restructuredtext en" @@ -69,23 +86,6 @@ __all__ = ['MAError', 'MaskError', 'MaskType', 'MaskedArray', 'var', 'where', 'zeros'] -import cPickle - -import numpy as np -from numpy import ndarray, amax, amin, iscomplexobj, bool_ -from numpy import array as narray - -import numpy.core.umath as umath -from numpy.lib.function_base import angle -import numpy.core.numerictypes as ntypes -from numpy.compat import getargspec, formatargspec -from numpy import expand_dims as n_expand_dims -import warnings - -import sys -if sys.version_info[0] >= 3: - from functools import reduce - MaskType = np.bool_ nomask = MaskType(0) @@ -7037,7 +7037,7 @@ def dump(a, F): """ if not hasattr(F, 'readline'): F = open(F, 'w') - return cPickle.dump(a, F) + return pickle.dump(a, F) def dumps(a): """ @@ -7052,7 +7052,7 @@ def dumps(a): returned. """ - return cPickle.dumps(a) + return pickle.dumps(a) def load(F): """ @@ -7076,7 +7076,7 @@ def load(F): """ if not hasattr(F, 'readline'): F = open(F, 'r') - return cPickle.load(F) + return pickle.load(F) def loads(strg): """ @@ -7094,7 +7094,7 @@ def loads(strg): dumps : Return a string corresponding to the pickling of a masked array. """ - return cPickle.loads(strg) + return pickle.loads(strg) ################################################################################ def fromfile(file, dtype=float, count= -1, sep=''): diff --git a/numpy/ma/tests/test_core.py b/numpy/ma/tests/test_core.py index 383e4a907..7eb4bbed2 100644 --- a/numpy/ma/tests/test_core.py +++ b/numpy/ma/tests/test_core.py @@ -10,21 +10,20 @@ __author__ = "Pierre GF Gerard-Marchant" import types import warnings +import sys +import pickle import numpy as np +import numpy.ma.core import numpy.core.fromnumeric as fromnumeric from numpy import ndarray from numpy.ma.testutils import * - -import numpy.ma.core from numpy.ma.core import * - from numpy.compat import asbytes, asbytes_nested from numpy.testing.utils import WarningManager pi = np.pi -import sys if sys.version_info[0] >= 3: from functools import reduce @@ -369,20 +368,18 @@ class TestMaskedArray(TestCase): def test_pickling(self): "Tests pickling" - import cPickle a = arange(10) a[::3] = masked a.fill_value = 999 - a_pickled = cPickle.loads(a.dumps()) + a_pickled = pickle.loads(a.dumps()) assert_equal(a_pickled._mask, a._mask) assert_equal(a_pickled._data, a._data) assert_equal(a_pickled.fill_value, 999) def test_pickling_subbaseclass(self): "Test pickling w/ a subclass of ndarray" - import cPickle a = array(np.matrix(list(range(10))), mask=[1, 0, 1, 0, 0] * 2) - a_pickled = cPickle.loads(a.dumps()) + a_pickled = pickle.loads(a.dumps()) assert_equal(a_pickled._mask, a._mask) assert_equal(a_pickled, a) self.assertTrue(isinstance(a_pickled._data, np.matrix)) @@ -390,37 +387,28 @@ class TestMaskedArray(TestCase): def test_pickling_maskedconstant(self): "Test pickling MaskedConstant" - import cPickle mc = np.ma.masked - mc_pickled = cPickle.loads(mc.dumps()) + mc_pickled = pickle.loads(mc.dumps()) assert_equal(mc_pickled._baseclass, mc._baseclass) assert_equal(mc_pickled._mask, mc._mask) assert_equal(mc_pickled._data, mc._data) def test_pickling_wstructured(self): "Tests pickling w/ structured array" - import cPickle a = array([(1, 1.), (2, 2.)], mask=[(0, 0), (0, 1)], dtype=[('a', int), ('b', float)]) - a_pickled = cPickle.loads(a.dumps()) + a_pickled = pickle.loads(a.dumps()) assert_equal(a_pickled._mask, a._mask) assert_equal(a_pickled, a) def test_pickling_keepalignment(self): "Tests pickling w/ F_CONTIGUOUS arrays" - import cPickle a = arange(10) a.shape = (-1, 2) b = a.T - test = cPickle.loads(cPickle.dumps(b)) + test = pickle.loads(pickle.dumps(b)) assert_equal(test, b) -# def test_pickling_oddity(self): -# "Test some pickling oddity" -# import cPickle -# a = array([{'a':1}, {'b':2}, 3], dtype=object) -# test = cPickle.loads(cPickle.dumps(a)) -# assert_equal(test, a) def test_single_element_subscript(self): "Tests single element subscripts of Maskedarrays." diff --git a/numpy/ma/tests/test_mrecords.py b/numpy/ma/tests/test_mrecords.py index d6f8d9765..3b9296a04 100644 --- a/numpy/ma/tests/test_mrecords.py +++ b/numpy/ma/tests/test_mrecords.py @@ -7,30 +7,30 @@ """ from __future__ import division, absolute_import -__author__ = "Pierre GF Gerard-Marchant ($Author: jarrod.millman $)" -__revision__ = "$Revision: 3473 $" -__date__ = '$Date: 2007-10-29 17:18:13 +0200 (Mon, 29 Oct 2007) $' - import sys +import warnings +import pickle + import numpy as np +import numpy.ma.testutils +import numpy.ma as ma from numpy import recarray from numpy.core.records import fromrecords as recfromrecords, \ fromarrays as recfromarrays from numpy.compat import asbytes, asbytes_nested - -import numpy.ma.testutils from numpy.ma.testutils import * - -import numpy.ma as ma from numpy.ma import masked, nomask - -import warnings from numpy.testing.utils import WarningManager - from numpy.ma.mrecords import MaskedRecords, mrecarray, fromarrays, \ fromtextfile, fromrecords, addfield + +__author__ = "Pierre GF Gerard-Marchant ($Author: jarrod.millman $)" +__revision__ = "$Revision: 3473 $" +__date__ = '$Date: 2007-10-29 17:18:13 +0200 (Mon, 29 Oct 2007) $' + + #.............................................................................. class TestMRecords(TestCase): "Base test class for MaskedArrays." @@ -293,11 +293,10 @@ class TestMRecords(TestCase): # def test_pickling(self): "Test pickling" - import cPickle base = self.base.copy() mrec = base.view(mrecarray) - _ = cPickle.dumps(mrec) - mrec_ = cPickle.loads(_) + _ = pickle.dumps(mrec) + mrec_ = pickle.loads(_) assert_equal(mrec_.dtype, mrec.dtype) assert_equal_records(mrec_._data, mrec._data) assert_equal(mrec_._mask, mrec._mask) diff --git a/numpy/numarray/functions.py b/numpy/numarray/functions.py index 2492d5f3f..9da96009f 100644 --- a/numpy/numarray/functions.py +++ b/numpy/numarray/functions.py @@ -25,7 +25,6 @@ __all__ += ['vdot', 'dot', 'matrixmultiply', 'ravel', 'indices', ] import copy -import copy_reg import types import os import sys @@ -44,6 +43,8 @@ from .numerictypes import typefrom if sys.version_info[0] >= 3: import copyreg as copy_reg +else: + import copy_reg isBigEndian = sys.byteorder != 'little' value = tcode = 'f' diff --git a/numpy/oldnumeric/compat.py b/numpy/oldnumeric/compat.py index 46c3c727f..b63226571 100644 --- a/numpy/oldnumeric/compat.py +++ b/numpy/oldnumeric/compat.py @@ -3,6 +3,17 @@ """ from __future__ import division, absolute_import +import sys +import copy +import pickle +from pickle import dump, dumps + +import numpy.core.multiarray as multiarray +import numpy.core.umath as um +from numpy.core.numeric import array +from . import functions + + __all__ = ['NewAxis', 'UFuncType', 'UfuncType', 'ArrayType', 'arraytype', 'LittleEndian', 'arrayrange', 'matrixmultiply', @@ -13,13 +24,6 @@ __all__ = ['NewAxis', 'Unpickler', 'Pickler' ] -import numpy.core.multiarray as multiarray -import numpy.core.umath as um -from numpy.core.numeric import array -from . import functions -import sys - -from cPickle import dump, dumps mu = multiarray @@ -47,8 +51,7 @@ def DumpArray(m, fp): m.dump(fp) def LoadArray(fp): - import cPickle - return cPickle.load(fp) + return pickle.load(fp) def array_constructor(shape, typecode, thestr, Endian=LittleEndian): if typecode == "O": @@ -70,8 +73,7 @@ def pickle_array(a): (a.shape, a.dtype.char, a.tostring(), LittleEndian)) def loads(astr): - import cPickle - arr = cPickle.loads(astr.replace('Numeric', 'numpy.oldnumeric')) + arr = pickle.loads(astr.replace('Numeric', 'numpy.oldnumeric')) return arr def load(fp): @@ -97,7 +99,6 @@ def _LoadArray(fp): else: return m -import pickle, copy if sys.version_info[0] >= 3: class Unpickler(pickle.Unpickler): # XXX: should we implement this? It's not completely straightforward diff --git a/numpy/oldnumeric/misc.py b/numpy/oldnumeric/misc.py index 8f1e1ae96..5ef1f0ac9 100644 --- a/numpy/oldnumeric/misc.py +++ b/numpy/oldnumeric/misc.py @@ -14,18 +14,17 @@ __all__ = ['sort', 'copy_reg', 'clip', 'rank', 'dot', 'outerproduct', 'innerproduct', 'insert'] import types -import StringIO import pickle import math import copy -import copy_reg - import sys + if sys.version_info[0] >= 3: - import copyreg - import io - StringIO = io.BytesIO - copy_reg = copyreg + import copyreg as copy_reg + from io import BytesIO as StringIO +else: + import copy_reg + from StringIO import StringIO from numpy import sort, clip, rank, sign, shape, putmask, allclose, size,\ choose, swapaxes, array_str, array_repr, e, pi, put, \ diff --git a/numpy/testing/utils.py b/numpy/testing/utils.py index eb212cb14..979894fbc 100644 --- a/numpy/testing/utils.py +++ b/numpy/testing/utils.py @@ -12,6 +12,11 @@ import types import warnings from .nosetester import import_nose +if sys.version_info[0] >= 3: + from io import StringIO +else: + from StringIO import StringIO + __all__ = ['assert_equal', 'assert_almost_equal','assert_approx_equal', 'assert_array_equal', 'assert_array_less', 'assert_string_equal', 'assert_array_almost_equal', 'assert_raises', 'build_err_msg', @@ -346,8 +351,7 @@ def print_assert_equal(test_string,actual,desired): import pprint if not (actual == desired): - import cStringIO - msg = cStringIO.StringIO() + msg = StringIO() msg.write(test_string) msg.write(' failed\nACTUAL: \n') pprint.pprint(actual,msg) |