Ticket #287: dimfixer.py

File dimfixer.py, 3.4 KB (added by benj, 10 years ago)

Python script to truncate BIL files to match file header dimensions

Line 
1#! /usr/bin/env python
2
3#########################
4# Script to truncate BIL files to the correct size from the associated header
5# Intended for files affected by the issue with azspec adding lines to the bottom of level 1 files
6#
7# Author: Ben Taylor
8#
9# Change history
10# 20 Nov 2009: Created
11#########################
12
13import sys
14import optparse
15import os.path
16import shutil
17
18try:   
19    import data_handler
20except:
21    print "data_handler.py not found in library path. Please get the latest version from subversion."
22    sys.exit(1)
23# end try
24
25# Command-line option handling
26usage = "\n%prog -c <input_file> [<input_file> ...]\n"
27usage = usage + "Fixes BIL data with extra lines on the bottom (truncates file to match header dimensions)"
28parser = optparse.OptionParser(usage=usage)
29parser.add_option("-c", "--copy", dest="copyfile", action="store_true", default=False, help="If set, makes a backup copy of each input file before truncating")
30
31(options, args) = parser.parse_args()
32
33# Check at least one input file was given
34if (len(args) < 1):
35    print "No input file specified"
36    parser.print_help()
37    sys.exit(1)
38# end if
39
40# For each file given
41for filepath in args:
42
43    # Check the file exists 
44    if (not os.path.isfile(filepath)):
45        print "Could not find file " + filepath
46        continue
47    # end if
48   
49    # Get the filename without path or extension
50    filename = os.path.basename(filepath)
51    filesplit = os.path.splitext(filename)
52    filebase = filesplit[0]
53   
54    # See if we can find the header file to use
55    if (os.path.isfile(filename + ".hdr")):
56        hdrfile = filename + ".hdr"
57    elif (os.path.isfile(filebase + ".hdr")):
58        hdrfile = filebase + ".hdr"
59    else:
60        print "Could not find header file for " + filepath
61        continue
62    # end if       
63   
64    # Read the header file
65    try:
66        hdrdata = data_handler.readHdrFile(hdrfile)
67    except:
68        print "Could not read header file " + hdrfile + ". Reason: " + str(sys.exc_info()[1])
69        continue
70    # end try
71   
72    # Check the header file has appropriate dimensions
73    if (not (("samples" in hdrdata) and ("lines" in hdrdata) and ("bands" in hdrdata))):
74        print "Dimension info missing from header file " + hdrfile
75        continue
76    # end if
77   
78    # Work out what the new size should be
79    newsize = int(hdrdata["samples"]) * int(hdrdata["lines"]) * int(hdrdata["bands"]) * 2
80   
81    # Create a backup copy if requested
82    if (options.copyfile):
83        try:
84            shutil.copy(filepath, filepath + "-original")
85        except:
86            print "Could not make backup copy of " + filepath + ". Reason: " + str(sys.exc_info()[1])
87            continue
88        # end try
89    # end if
90   
91    # Open the file in append mode (just using write mode results in it zero-filling when it's truncated)
92    try:
93        datafile = open(filepath, "ab")
94    except:
95        print "Could not open data file " + filepath + ". Reason: " + str(sys.exc_info()[1])
96        continue
97    # end try
98   
99    # Truncate the file to the right size
100    try:
101        datafile.truncate(newsize)
102    except:
103        print "Could not truncate data file " + filepath + ". Reason: " + str(sys.exc_info()[1])
104        datafile.close()
105        continue
106    # end try
107   
108    # Close the file
109    try:
110        datafile.close()
111    except:
112        pass
113    # end try
114   
115    print "Successfully truncated " + filepath
116# end for
117
118print "Finished"