Last active
August 29, 2015 13:58
-
-
Save paulromano/10322974 to your computer and use it in GitHub Desktop.
Convert an ACE file in ASCII format (Type 1) to binary format (Type 2)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
from __future__ import division | |
from struct import pack | |
import sys | |
def ascii_to_binary(ascii_file, binary_file): | |
"""Convert an ACE file in ASCII format (type 1) to binary format (type 2). | |
Parameters | |
---------- | |
ascii_file : str | |
Filename of ASCII ACE file | |
binary_file : str | |
Filename of binary ACE file to be written | |
""" | |
# Open ASCII and binary files | |
ascii = open(ascii_file, 'r') | |
binary = open(binary_file, 'wb') | |
# Set default record length | |
record_length = 4096 | |
# Read data from ASCII file | |
lines = ascii.readlines() | |
ascii.close() | |
idx = 0 | |
while idx < len(lines): | |
# Read/write header block | |
hz = lines[idx][:10].encode('UTF-8') | |
aw0 = float(lines[idx][10:22]) | |
tz = float(lines[idx][22:34]) | |
hd = lines[idx][35:45].encode('UTF-8') | |
hk = lines[idx + 1][:70].encode('UTF-8') | |
hm = lines[idx + 1][70:80].encode('UTF-8') | |
binary.write(pack('=10sdd10s70s10s', hz, aw0, tz, hd, hk, hm)) | |
# Read/write IZ/AW pairs | |
data = ' '.join(lines[idx + 2:idx + 6]).split() | |
iz = list(map(int, data[::2])) | |
aw = list(map(float, data[1::2])) | |
izaw = [item for sublist in zip(iz, aw) for item in sublist] | |
binary.write(pack('=' + 16*'id', *izaw)) | |
# Read/write NXS and JXS arrays. Null bytes are added at the end so | |
# that XSS will start at the second record | |
nxs = list(map(int, ' '.join(lines[idx + 6:idx + 8]).split())) | |
jxs = list(map(int, ' '.join(lines[idx + 8:idx + 12]).split())) | |
binary.write(pack('=16i32i{0}x'.format(record_length - 500), *(nxs + jxs))) | |
# Read/write XSS array. Null bytes are added to form a complete record | |
# at the end of the file | |
n_lines = (nxs[0] + 3)//4 | |
xss = list(map(float, ' '.join(lines[idx + 12:idx + 12 + n_lines]).split())) | |
extra_bytes = record_length - ((len(xss)*8 - 1) % record_length + 1) | |
binary.write(pack('={0}d{1}x'.format(nxs[0], extra_bytes), *xss)) | |
# Advance to next table in file | |
idx += 12 + n_lines | |
# Close binary file | |
binary.close() | |
if __name__ == '__main__': | |
# Check for proper number of arguments | |
if len(sys.argv) < 3: | |
sys.exit('Usage: {0} ascii_file binary_file'.format(sys.argv[0])) | |
# Convert ASCII file | |
ascii_to_binary(sys.argv[1], sys.argv[2]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment