diff --git a/nibabel/filename_parser.py b/nibabel/filename_parser.py index 9b4a7efef3..db6e073018 100644 --- a/nibabel/filename_parser.py +++ b/nibabel/filename_parser.py @@ -264,9 +264,14 @@ def splitext_addext(filename, for ext in addexts: if endswith(filename, ext): extpos = -len(ext) - addext = filename[extpos:] - filename = filename[:extpos] + filename, addext = filename[:extpos], filename[extpos:] break else: addext = '' - return os.path.splitext(filename) + (addext,) + # os.path.splitext() behaves unexpectedly when filename starts with '.' + extpos = filename.rfind('.') + if extpos < 0 or filename.strip('.') == '': + root, ext = filename, '' + else: + root, ext = filename[:extpos], filename[extpos:] + return (root, ext, addext) diff --git a/nibabel/tests/test_filename_parser.py b/nibabel/tests/test_filename_parser.py index d8cb550f60..f7317ac183 100644 --- a/nibabel/tests/test_filename_parser.py +++ b/nibabel/tests/test_filename_parser.py @@ -159,3 +159,14 @@ def test_splitext_addext(): # case sensitive res = splitext_addext('fname.ext.FOO', ('.foo', '.bar'), True) assert_equal(res, ('fname.ext', '.FOO', '')) + # edge cases + res = splitext_addext('.nii') + assert_equal(res, ('', '.nii', '')) + res = splitext_addext('...nii') + assert_equal(res, ('..', '.nii', '')) + res = splitext_addext('.') + assert_equal(res, ('.', '', '')) + res = splitext_addext('..') + assert_equal(res, ('..', '', '')) + res = splitext_addext('...') + assert_equal(res, ('...', '', ''))