Skip to content

Commit f4731e7

Browse files
committed
Added support for non-lowercase ENVI header parameter names.
* spectral.py (Settings): Added envi_support_nonlowercase_params member. * io/envi.py (read_envi_header): Provide support for non-lowercase parameter names. Display warning when names are converted to lower case. * tests/envi.py: Added tests for non-lowercase ENVI header parameter names.
1 parent 0817e41 commit f4731e7

File tree

3 files changed

+59
-1
lines changed

3 files changed

+59
-1
lines changed

spectral/io/envi.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ def read_envi_header(file):
132132
dictionary as strings. Header field names are treated as case
133133
insensitive and all keys in the dictionary are lowercase.
134134
'''
135+
import warnings
136+
from spectral import settings
135137
f = builtins.open(file, 'r')
136138

137139
try:
@@ -152,14 +154,20 @@ def read_envi_header(file):
152154
f.close()
153155

154156
dict = {}
157+
have_nonlowercase_param = False
158+
support_nonlowercase_params = settings.envi_support_nonlowercase_params
155159
try:
156160
while lines:
157161
line = lines.pop(0)
158162
if line.find('=') == -1: continue
159163
if line[0] == ';': continue
160164

161165
(key, sep, val) = line.partition('=')
162-
key = key.strip().lower()
166+
key = key.strip()
167+
if not key.islower():
168+
have_nonlowercase_param = True
169+
if not support_nonlowercase_params:
170+
key = key.lower()
163171
val = val.strip()
164172
if val and val[0] == '{':
165173
str = val.strip()
@@ -178,6 +186,14 @@ def read_envi_header(file):
178186
else:
179187
dict[key] = val
180188

189+
if have_nonlowercase_param and not support_nonlowercase_params:
190+
msg = 'Parameters with non-lowercase names encountered ' \
191+
'and converted to lowercase. To retain source file ' \
192+
'parameter name capitalization, set ' \
193+
'spectral.setttings.envi_support_nonlowercase_params to ' \
194+
'True.'
195+
warnings.warn(msg)
196+
print('Header parameter names converted to lower case.')
181197
return dict
182198
except:
183199
raise EnviHeaderParsingError()

spectral/spectral.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ class SpySettings:
5353
If calls to `view_cube` or `view_nd` result in windows with blank
5454
canvases, try reducing this value.
5555
56+
`envi_support_nonlowercase_params` (bool, default False)
57+
58+
By default, ENVI headers are read with parameter names converted
59+
to lower case. If this attribute is set to True, parameters will
60+
be read with original capitalization retained.
61+
5662
`show_progress` (bool, default True):
5763
5864
Indicates whether long-running algorithms should display progress
@@ -123,6 +129,8 @@ class SpySettings:
123129
# canvas does not render, try reducing this value (e.g., 16).
124130
WX_GL_DEPTH_SIZE = 24
125131

132+
envi_support_nonlowercase_params = False
133+
126134
# Should algorithms show completion progress of algorithms?
127135
show_progress = True
128136

spectral/tests/envi.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@
4343
from .spytest import SpyTest
4444
from spectral.tests import testdir
4545

46+
MIXED_CASE_HEADER = '''ENVI
47+
samples = 145
48+
lines = 145
49+
bands = 220
50+
header offset = 0
51+
file type = ENVI Standard
52+
data type = 4
53+
interleave = bip
54+
byte order = 0
55+
some Param = 0
56+
'''
57+
4658
class ENVIWriteTest(SpyTest):
4759
'''Tests that SpyFile memmap interfaces read and write properly.'''
4860
def __init__(self):
@@ -265,6 +277,28 @@ def test_header_missing_mandatory_parameter_fails(self):
265277
else:
266278
raise Exception('Failed to raise EnviMissingHeaderParameter')
267279

280+
def test_param_name_converted_to_lower_case(self):
281+
'''By default, parameter names are converted to lower case.'''
282+
import spectral as spy
283+
header = 'mixed_case_header.hdr'
284+
open(header, 'w').write(MIXED_CASE_HEADER)
285+
h = spy.envi.read_envi_header(header)
286+
assert('some param' in h)
287+
288+
def test_support_nonlowercase_params(self):
289+
'''By default, parameter names are converted to lower case.'''
290+
import spectral as spy
291+
from spectral import settings
292+
header = 'mixed_case_header.hdr'
293+
open(header, 'w').write(MIXED_CASE_HEADER)
294+
orig = settings.envi_support_nonlowercase_params
295+
try:
296+
settings.envi_support_nonlowercase_params = True
297+
h = spy.envi.read_envi_header(header)
298+
finally:
299+
settings.envi_support_nonlowercase_params = orig
300+
assert('some Param' in h)
301+
268302
def test_missing_ENVI_in_header_fails(self):
269303
'''FileNotAnEnviHeader should be raised if "ENVI" not on first line.'''
270304
import os

0 commit comments

Comments
 (0)