From ccbedfa15079e17c24ec4cebee7f50689422611a Mon Sep 17 00:00:00 2001 From: Robert Smallshire Date: Wed, 28 Jan 2015 21:50:04 +0100 Subject: [PATCH] High level SEG Y writer. Work in progress --- segpy/writer.py | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 segpy/writer.py diff --git a/segpy/writer.py b/segpy/writer.py new file mode 100644 index 0000000..cf3cedb --- /dev/null +++ b/segpy/writer.py @@ -0,0 +1,56 @@ +from segpy.encoding import ASCII, is_supported_encoding, UnsupportedEncodingError +from segpy.toolkit import (write_textual_reel_header, write_binary_reel_header, compile_trace_header_format, + write_trace_header, write_trace_samples, format_extended_textual_header, + write_extended_textual_headers) + + +def write_segy(fh, + seg_y_data, + encoding=None, + endian='>', + progress=None): + """ + Args: + fh: A file-like object open for binary write. + + seg_y_data: An object from which the headers and trace_samples data can be retrieved. Requires the following + properties and methods: + seg_y_data.textual_reel_header + seg_y_data.binary_reel_header + seg_y_data.extended_textual_header + seg_y_data.trace_indexes + seg_y_data.trace_header(trace_index) + seg_y_data.trace_samples(trace_index) + + seg_y_data.encoding + seg_y_data.endian + + One such legitimate object would be a SegYReader instance. + + encoding: Optional encoding for text data. Typically 'cp037' for EBCDIC or 'ascii' for ASCII. If ommited, the + seg_y_data object will be queries for an encoding property. + + endian: Big endian by default. If omitted, the seg_y_data object will be queried for an encoding property. + + progress: An optional progress bar object. + """ + + encoding = encoding or (hasattr(seg_y_data, 'encoding') and seg_y_data.encoding) or ASCII + + if not is_supported_encoding(encoding): + raise UnsupportedEncodingError("Writing SEG Y", encoding) + + extended_header_pages = format_extended_textual_header(seg_y_data.extended_textual_header, encoding, include_text_stop=True) + + write_textual_reel_header(fh, seg_y_data.textual_reel_header, encoding) + write_binary_reel_header(fh, seg_y_data.binary_reel_header, endian) + write_extended_textual_headers(fh, extended_header_pages, encoding) + + trace_header_format = compile_trace_header_format(endian) + + for trace_index in seg_y_data.trace_indexes: + write_trace_header(fh, seg_y_data.trace_header(trace_index), trace_header_format) + write_trace_samples(fh, seg_y_data.trace_samples(trace_index), seg_y_data.data_sample_format) + + +