Skip to content

Instantly share code, notes, and snippets.

@davidrpmorris
Created November 21, 2018 02:09
Show Gist options
  • Save davidrpmorris/4c85825322671ae3de2384cc062a8567 to your computer and use it in GitHub Desktop.
Save davidrpmorris/4c85825322671ae3de2384cc062a8567 to your computer and use it in GitHub Desktop.
import numpy as np
import sys
# this is the file's name or path to the file
fname = 'vox.gsf'
def gsf_read(fname):
if fname.rpartition('.')[1] == '.':
fname = fname[0:fname.rfind('.')]
gsf_file = open(fname + '.gsf', 'rb')
metadata = {}
# check if header is OK
if not (gsf_file.readline().decode('UTF-8') == 'Gwyddion Simple Field 1.0\n'):
gsf_file.close()
raise ValueError("File has wrong header")
term = b'00'
# read metadata header
while term != b'\x00':
line_string = gsf_file.readline().decode('UTF-8')
metadata[line_string.rpartition(' = ')[0]] = line_string.rpartition('=')[2]
term = gsf_file.read(1)
gsf_file.seek(-1, 1)
gsf_file.read(4 - gsf_file.tell() % 4)
# fix known metadata types from .gsf file specs
# mandatory
metadata['XRes'] = np.int(metadata['XRes'])
metadata['YRes'] = np.int(metadata['YRes'])
# optional
for k in ['XReal', 'YReal', 'XOffset', 'YOffset', 'XYUnits', 'ZUnits', 'Title', 'Date', 'DwellTime']:
if k in metadata:
try:
metadata[k] = np.float(metadata[k])
except:
metadata[k] = np.str(metadata[k].split("\n")[0])
raw = np.frombuffer(gsf_file.read(), dtype='float32')
product = metadata['XRes'] * metadata['YRes']
if len(raw) != product:
difference = product - len(raw)
data = np.pad(raw, (0, difference), 'minimum')
else:
data = raw
data = np.reshape(data, (metadata['YRes'], metadata['XRes']))
print(data)
gsf_file.close()
return metadata, data
metadata, data = gsf_read(fname)
print(metadata)
def gsf_write(data, newfname, metadata={}):
gsf_file = open(newfname + '.gsf', 'wb')
s = ''
s += 'Gwyddion Simple Field 1.0' + '\n'
for k in metadata.keys():
print(k, metadata[k])
if k == 'XRes' or k == 'YRes':
s += k + ' = ' + '{0:d}'.format(metadata[k]) + '\n'
continue
elif k == 'XReal' or k == 'YReal':
s += k + ' = ' + '{0:g}'.format(metadata[k]) + '\n'
continue
try:
s += k + ' = ' + '{0:G}'.format(metadata[k]) + '\n'
except:
s += k + ' = ' + str(metadata[k]) + '\n'
gsf_file.write(bytes(s, 'UTF-8'))
gsf_file.write(b'\x00' * (4 - len(s) % 4))
gsf_file.write(data.tobytes(None))
gsf_file.close()
newfname = 'test_fixed'
gsf_write(data, newfname, metadata)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment