|
137 | 137 | except NameError: # python 3
|
138 | 138 | basestring = str
|
139 | 139 |
|
| 140 | +import os.path |
140 | 141 | import warnings
|
141 | 142 |
|
142 | 143 | import numpy as np
|
@@ -890,18 +891,30 @@ def is_image(klass, filename, sniff=None):
|
890 | 891 | return True, sniff
|
891 | 892 |
|
892 | 893 | # Determine the metadata location, then sniff it
|
893 |
| - ftypes = dict(klass.files_types) |
894 |
| - if 'header' not in ftypes: |
| 894 | + header_exts = [ft[1] for ft in klass.files_types if ft[0] == 'header'] |
| 895 | + if len(header_exts) == 0: |
895 | 896 | metadata_filename = filename
|
896 | 897 | else:
|
897 |
| - metadata_filename = froot + ftypes['header'] + trailing |
| 898 | + # Search for an acceptable existing header; |
| 899 | + # could be compressed or not... |
| 900 | + for ext in header_exts: |
| 901 | + for tr_ext in np.unique([trailing, ''] + list(klass._compressed_exts)): |
| 902 | + metadata_filename = froot + ext + tr_ext |
| 903 | + if os.path.exists(metadata_filename): |
| 904 | + break |
898 | 905 |
|
899 |
| - sniff_size = 1024 # klass.header_class.sniff_size |
900 |
| - if not sniff or len(sniff) < sniff_size: |
901 |
| - with BinOpener(metadata_filename, 'rb') as fobj: |
902 |
| - sniff = fobj.read(sniff_size) |
903 |
| - |
904 |
| - return klass.header_class.is_header(sniff[:sniff_size]), sniff |
| 906 | + try: |
| 907 | + if not sniff or len(sniff) < klass.header_class.sniff_size: |
| 908 | + # 1024 == large size, for efficiency (could iterate over imageclasses). |
| 909 | + sniff_size = np.max([1024, klass.header_class.sniff_size]) |
| 910 | + with BinOpener(metadata_filename, 'rb') as fobj: |
| 911 | + sniff = fobj.read(sniff_size) |
| 912 | + return klass.header_class.is_header(sniff[:klass.header_class.sniff_size]), sniff |
| 913 | + except Exception as e: |
| 914 | + # Can happen if: file doesn't exist, |
| 915 | + # filesize < necessary sniff size (this happens!) |
| 916 | + # other unexpected errors. |
| 917 | + return False, sniff |
905 | 918 |
|
906 | 919 | def __getitem__(self):
|
907 | 920 | ''' No slicing or dictionary interface for images
|
|
0 commit comments