Source code for tuiview.archivereader

"""
Check if file within a zip archive and return apropriate GDAL path if so.

See GDAL documentation on reading files within a zip archive.

http://trac.osgeo.org/gdal/wiki/UserDocs/ReadInZip
"""
# This file is part of 'TuiView' - a simple Raster viewer
# Copyright (C) 2012  Sam Gillingham
#
# archivereader.py written by Terry Cain (2014), Plymouth Marine Laboratory 
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

import zipfile

ALLOWED_FILE_EXTENSIONS = ('.bil', '.bsq', '.bin', '.env', '.dem', '.tif', '.asc', '.img')


[docs]def file_list_to_archive_strings(filenames): """ Modifies any archive filenames in the list to allow them to be opened using a GDAL virtual filesystem. :param filenames: A list of filenames :type filenames: list of str :return: The list of filenames passed in, with any supported archive prepended with the appropriate string. :rtype: list of str """ output_filename_list = [] for filename in filenames: if filename.endswith('.gz') and filename.find(".tar.gz") == -1: # can process gz files but opening tar files in python (tarfile) takes ages output_filename_list.append(gz_to_file(filename)) elif filename.endswith('.zip'): output_filename_list.extend(zip_to_file(filename)) else: output_filename_list.append(filename) return output_filename_list
[docs]def gz_to_file(filepath): """ Converts a path ending in .gz so that it can be opened with GDAL :param filepath: Filepath ending in .gz :type filepath: str :return: Filepath prepended with gzip virtual filesystem string :rtype: str """ return "/vsigzip/" + filepath
[docs]def zip_to_file(filepath): """ Takes in a zip filepath and if the zip contains files that can be opened with GDAL then the filepath will be converted so that it can be opened without extraction. :param filepath: Filepath ending in .zip :type filepath: str :return: A list of files prepended with the zip virtual filesystem string :rtype: list of str """ zip_file_list = [] if zipfile.is_zipfile(filepath): try: zip_file = zipfile.ZipFile(filepath) zip_file_contents = ['/vsizip/{0}/{1}'.format(filepath, zip_info_object.filename) for zip_info_object in zip_file.filelist if zip_info_object.filename.endswith(ALLOWED_FILE_EXTENSIONS)] zip_file_list.extend(zip_file_contents) zip_file.close() except zipfile.BadZipfile: pass return zip_file_list