เอกสารอย่างเป็นทางการโฮสต์อยู่ใน readthedocs
Segyio เป็นไลบรารี C ที่ได้รับลิขสิทธิ์ LGPL ขนาดเล็กเพื่อการโต้ตอบกับข้อมูลแผ่นดินไหวในรูปแบบ SEG-Y และ Seismic Unix ได้อย่างง่ายดาย พร้อมการเชื่อมโยงภาษาสำหรับ Python และ Matlab Segyio คือความพยายามที่จะสร้างไลบรารีที่เน้นชุมชนที่ใช้งานง่าย ฝังได้ และมุ่งเน้นชุมชนสำหรับแอปพลิเคชันเกี่ยวกับแผ่นดินไหว มีการเพิ่มคุณสมบัติตามที่จำเป็น ยินดีรับข้อเสนอแนะและการสนับสนุนทุกประเภท
หากต้องการติดตามการพัฒนาและฟีเจอร์ล่าสุด โปรดดูบันทึกการเปลี่ยนแปลง หากต้องการเขียนรหัสพิสูจน์ในอนาคต ให้ดูการเปลี่ยนแปลงที่แตกหักที่วางแผนไว้
เมื่อสร้างและติดตั้ง segyio คุณก็พร้อมที่จะเริ่มเขียนโปรแกรมแล้ว! ดูบทช่วยสอน ตัวอย่าง โปรแกรมตัวอย่าง และสมุดบันทึกตัวอย่าง หากต้องการข้อมูลอ้างอิงทางเทคนิคพร้อมตัวอย่างและสูตรอาหารเล็กๆ โปรดอ่านเอกสาร เอกสาร API ยังสามารถใช้ได้กับ pydoc - เริ่มล่าม Python ที่คุณชื่นชอบแล้วพิมพ์ help(segyio)
ซึ่งควรทำงานร่วมกับ IDLE, pycharm และเครื่องมือ Python อื่น ๆ ได้ดี
import segyio
import numpy as np
with segyio . open ( 'file.sgy' ) as f :
for trace in f . trace :
filtered = trace [ np . where ( trace < 1e-2 )]
ดูตัวอย่างเพิ่มเติม
สำเนาของ segyio มีทั้งแบบไบนารีที่สร้างไว้ล่วงหน้าและซอร์สโค้ด:
apt install python3-segyio
pip install segyio
git clone https://github.com/statoil/segyio
ในการสร้าง Segyio คุณต้องมี:
ในการสร้างเอกสาร คุณต้องมีสฟิงซ์ด้วย
หากต้องการสร้างและติดตั้ง segyio ให้ดำเนินการต่อไปนี้ในคอนโซลของคุณ:
git clone https://github.com/equinor/segyio
mkdir segyio/build
cd segyio/build
cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON
make
make install
make install
ต้องทำในฐานะรูทสำหรับการติดตั้งระบบ หากคุณต้องการติดตั้งในโฮมไดเร็กตอรี่ของคุณ ให้เพิ่ม -DCMAKE_INSTALL_PREFIX=~/
หรือไดเร็กทอรีที่เหมาะสมอื่นๆ หรือ make DESTDIR=~/ install
โปรดตรวจสอบให้แน่ใจว่าสภาพแวดล้อมของคุณเลือกใช้ตำแหน่งการติดตั้งที่ไม่ได้มาตรฐาน (PYTHONPATH, LD_LIBRARY_PATH และ PATH)
หากคุณมีการติดตั้ง Python หลายรายการ หรือต้องการใช้ล่ามทางเลือก คุณสามารถช่วย cmake ค้นหาสิ่งที่ถูกต้องได้โดยส่ง -DPYTHON_EXECUTABLE=/opt/python/binary
พร้อมด้วยคำนำหน้าการติดตั้งและประเภทบิลด์
หากต้องการสร้างการเชื่อมโยง Matlab ให้เรียกใช้ CMake ด้วยตัวเลือก -DBUILD_MEX=ON
ในบางสภาพแวดล้อม ไบนารี Matlab อยู่ในตำแหน่งที่ไม่ได้มาตรฐาน ซึ่งในกรณีนี้ คุณต้องช่วย CMake ค้นหาไบนารี Matlab โดยการส่ง -DMATLAB_ROOT=/path/to/matlab
ขอแนะนำให้สร้างในโหมดแก้ไขข้อบกพร่องเพื่อรับคำเตือนเพิ่มเติมและฝังสัญลักษณ์แก้ไขข้อบกพร่องในออบเจ็กต์ การแทนที่ Debug
สำหรับ Release
ใน CMAKE_BUILD_TYPE
นั้นมีอยู่มากมาย
การทดสอบจะอยู่ในไดเร็กทอรีภาษา/การทดสอบ และขอแนะนำเป็นอย่างยิ่งว่าคุณลักษณะใหม่ที่เพิ่มเข้ามานั้นแสดงให้เห็นถึงความถูกต้องและสัญญาโดยการเพิ่มการทดสอบ การทดสอบทั้งหมดสามารถทำได้โดยการเรียกใช้ ctest
คุณสามารถใช้แบบทดสอบที่เขียนไว้แล้วเพื่อเป็นแนวทางได้
หลังจากสร้าง segyio แล้ว คุณสามารถรันการทดสอบด้วย ctest
ซึ่งดำเนินการจากไดเร็กทอรี build
โปรดทราบว่าในการรันตัวอย่าง Python คุณต้องแจ้งให้สภาพแวดล้อมของคุณทราบว่าจะหาไลบรารี Python ได้ที่ไหน สามารถติดตั้งในฐานะผู้ใช้หรือเพิ่มไลบรารี segyio/build/python ให้กับ pythonpath ของคุณ
โค้ดทั้งหมดในบทช่วยสอนนี้ถือว่ามีการนำเข้า segyio และตัวเลขนั้นพร้อมใช้งานเป็น np
import segyio
import numpy as np
บทช่วยสอนนี้ถือว่าคุณคุ้นเคยกับ Python และ numpy หากต้องการรีเฟรช โปรดดูบทช่วยสอน Python และการเริ่มต้นอย่างรวดเร็ว
การเปิดไฟล์สำหรับการอ่านเสร็จสิ้นด้วยฟังก์ชัน segyio.open
และใช้กับตัวจัดการบริบทตามสำนวน การใช้คำสั่ง with
ไฟล์จะถูกปิดอย่างถูกต้องแม้ในกรณีที่มีข้อยกเว้น ตามค่าเริ่มต้น ไฟล์จะถูกเปิดแบบอ่านอย่างเดียว
with segyio . open ( filename ) as f :
...
Open ยอมรับหลายตัวเลือก (สำหรับการอ้างอิงที่ครอบคลุมมากขึ้น ให้ตรวจสอบ docstring ของฟังก์ชัน open ด้วย help(segyio.open)
ตัวเลือกที่สำคัญที่สุดคืออาร์กิวเมนต์ตำแหน่งที่สอง (เป็นทางเลือก) หากต้องการเปิดไฟล์สำหรับการเขียน ให้ทำ segyio.open(filename, 'r+')
จากฟังก์ชัน C fopen
ไฟล์สามารถเปิดได้ในโหมด ไม่มีโครงสร้าง ไม่ว่าจะโดยการส่ง segyio.open
อาร์กิวเมนต์เสริม strict=False
ซึ่งในกรณีนี้การไม่สร้างโครงสร้าง (หมายเลขอินไลน์ หมายเลข crossline ฯลฯ) ไม่ใช่ข้อผิดพลาด และ ignore_geometry=True
ซึ่งในกรณีนี้ segyio จะไม่พยายามตั้งค่าคุณลักษณะภายในเหล่านี้ด้วยซ้ำ
วัตถุไฟล์ segy มีคุณสมบัติสาธารณะหลายประการที่อธิบายโครงสร้างนี้:
f.ilines
อนุมานตัวเลขอินไลน์f.xlines
หมายเลขครอสไลน์ที่อนุมานf.offsets
อนุมานหมายเลขออฟเซ็ตf.samples
การชดเชยตัวอย่างที่อนุมาน (ความถี่และการหน่วงเวลาการบันทึก)f.unstructured
จริงถ้าไม่มีโครงสร้าง เท็จถ้ามีโครงสร้างf.ext_headers
จำนวนส่วนหัวของข้อความที่ขยาย หากไฟล์ถูกเปิด โดยไม่มีโครงสร้าง คุณสมบัติบรรทัดทั้งหมดจะเป็น None
ใน Segyio ข้อมูลจะถูกดึงและเขียนผ่าน โหมด ที่เรียกว่า โหมดเป็นอาร์เรย์เชิงนามธรรมหรือรูปแบบการกำหนดที่อยู่ และเปลี่ยนชื่อและดัชนีหมายถึงอะไร โหมดทั้งหมดเป็นคุณสมบัติบนวัตถุตัวจัดการไฟล์ รองรับฟังก์ชัน len
และการอ่านและเขียนทำได้ผ่าน f.mode[]
เขียนเสร็จแล้วตามที่ได้รับมอบหมาย โหมดรองรับการแบ่งส่วนอาเรย์ที่ได้รับแรงบันดาลใจจากตัวเลข มีโหมดต่อไปนี้:
trace
โหมดการติดตามนำเสนอการกำหนดแอดเดรสแบบดิบของการติดตามตามที่จัดวางในไฟล์ โหมดนี้พร้อมกับ header
ถือเป็นโหมดเดียวที่ใช้ได้กับไฟล์ที่ไม่มีโครงสร้าง ร่องรอยมีการแจกแจง 0..len(f.trace)
การอ่านการติดตามจะให้ผล ndarray
จำนวนมาก และการอ่านการติดตามหลายรายการจะให้กำเนิด ndarray
s มีการใช้ซีแมนทิกส์ของตัวสร้างและออบเจ็กต์เดียวกันนี้ถูกนำมาใช้ซ้ำ ดังนั้นหากคุณต้องการแคชหรือระบุที่อยู่ข้อมูลการติดตามในภายหลัง คุณต้องคัดลอกอย่างชัดเจน
> >> f . trace [ 10 ]
> >> f . trace [ - 2 ]
> >> f . trace [ 15 : 45 ]
> >> f . trace [: 45 : 3 ]
header
ด้วยการจัดการกับพฤติกรรมที่คล้ายกับ trace
การเข้าถึงรายการจะให้ออบเจ็กต์ส่วนหัวแทนการใช้ ndarray
s ที่เป็นตัวเลข ส่วนหัวเป็นอ็อบเจ็กต์ที่มีลักษณะคล้าย dict โดยที่คีย์เป็นจำนวนเต็ม คีย์แบบ seismic unix (ในโมดูล segyio.su) และ segyio enums (segyio.TraceField)
ค่าส่วนหัวสามารถอัปเดตได้โดยการกำหนด dict-like ให้กับมัน และคีย์ที่ไม่ปรากฏทางด้านขวามือของการกำหนดจะ ไม่ได้รับการแก้ไข
> >> f . header [ 5 ] = { segyio . su . tracl : 10 }
> >> f . header [ 5 ]. items ()
> >> f . header [ 5 ][ 25 , 37 ] # read multiple values at once
iline
, xline
โหมดเหล่านี้จะทำให้เกิดข้อผิดพลาดหากไฟล์ไม่มีโครงสร้าง พวกเขาถือว่าข้อโต้แย้งของ []
เป็น กุญแจ ของบรรทัดที่เกี่ยวข้อง หมายเลขบรรทัดจะเพิ่มขึ้นอยู่เสมอ แต่อาจมีระยะห่างที่ไม่สม่ำเสมอและกำหนดเองได้ ชื่อที่ถูกต้องสามารถพบได้ในคุณสมบัติ ilines
และ xlines
เช่นเดียวกับการติดตาม การได้หนึ่งบรรทัดจะให้ผล ndarray
และเสี้ยวหนึ่งของเส้นจะให้ผลกำเนิดของ ndarray
s เมื่อใช้สไลซ์ที่มีขั้นตอน รายการระดับกลางบางรายการอาจถูกข้ามไปหากขั้นตอนไม่ตรงกัน เช่น ทำ f.line[1:10:3]
ในไฟล์ที่มีบรรทัด [1,2,3,4,5]
เทียบเท่ากับการค้นหา 1, 4, 7
และการค้นหา [1,4]
เมื่อทำงานกับไฟล์พรีสแต็ก 4D ออฟเซ็ตแรกจะถูกอ่านโดยปริยาย หากต้องการเข้าถึงออฟเซ็ตอื่นหรือช่วง ให้ใช้ดัชนีหรือช่วงที่คั่นด้วยเครื่องหมายจุลภาค เช่น: f.iline[120, 4]
fast
slow
สิ่งเหล่านี้เป็นนามแฝงสำหรับ iline
และ xline
ซึ่งพิจารณาจากวิธีวางร่องรอย สำหรับไฟล์ที่เรียงลำดับแบบอินไลน์ fast
จะให้ผล iline
depth_slice
ส่วนความลึกคือการตัดแนวนอนทั้งไฟล์ที่ระดับความลึก ค่าที่ได้คือ ndarray
s และตัวกำเนิดของอาร์เรย์
gather
gather
คือจุดตัดของอินไลน์และครอสไลน์ ซึ่งเป็นคอลัมน์แนวตั้งของการสำรวจ และเว้นแต่มีการระบุออฟเซ็ตเดียวจะส่งกลับค่าออฟเซ็ต x ตัวอย่าง ndarray
เมื่อมีช่วงอยู่ ก็จะส่งกลับตัวกำเนิดของ ndarray
s ดังกล่าว
text
โหมด text
คืออาร์เรย์ของส่วนหัวที่เป็นข้อความ โดยที่ text[0]
เป็นส่วนหัวของข้อความที่ได้รับคำสั่งมาตรฐาน และ 1..n
เป็นส่วนหัวแบบขยายที่เป็นทางเลือก
ส่วนหัวของข้อความจะถูกส่งกลับเป็นหยดแบบไบต์ขนาด 3200 ไบต์เหมือนกับที่อยู่ในไฟล์ ฟังก์ชัน segyio.tools.wrap
สามารถสร้างเวอร์ชันที่เน้นบรรทัดของสตริงนี้
bin
ค่าของส่วนหัวไบนารีทั้งไฟล์ที่มีอินเทอร์เฟซคล้าย dict ทำงานเหมือนกับโหมด header
แต่ไม่มีการจัดทำดัชนี
> >> for line in f . iline [: 2430 ]:
... print ( np . average ( line ))
> >> for line in f . xline [ 2 : 10 ]:
... print ( line )
> >> for line in f . fast [:: 2 ]:
... print ( np . min ( line ))
> >> for factor , offset in enumerate ( f . iline [ 10 , :]):
... offset *= factor
print ( offset )
> >> f . gather [ 200 , 241 , :]. shape
> >> text = f . text [ 0 ]
> >> type( text )
< type 'bytes' >
> >> f . trace [ 10 ] = np . zeros ( len ( f . samples ))
ตัวอย่างและสูตรอาหารเพิ่มเติมสามารถพบได้ในวิธีใช้เอกสาร help(segyio)
และส่วนตัวอย่าง
Segyio ไม่จำเป็นต้องพยายามที่จะเป็นจุดสิ้นสุดของการโต้ตอบ SEG-Y ทั้งหมด; แต่เรามุ่งมั่นที่จะลดอุปสรรคในการโต้ตอบกับไฟล์ SEG-Y สำหรับการฝัง แอปพลิเคชันใหม่ หรือโปรแกรมอิสระ
นอกจากนี้ จุดมุ่งหมายไม่ใช่การสนับสนุนไฟล์รูปแบบมาตรฐานเต็มรูปแบบหรือรูปแบบแปลกใหม่ทั้งหมด (แต่เป็นไปตามมาตรฐาน) มีการตั้งสมมติฐานบางประการ เช่น:
ปัจจุบัน Segyio รองรับ:
ฟังก์ชั่นการเขียนใน segyio มีไว้เพื่อ แก้ไข หรือดัดแปลงไฟล์เป็นส่วนใหญ่ ไฟล์ที่สร้างขึ้นตั้งแต่เริ่มต้นไม่จำเป็นต้องเป็นไฟล์ SEG-Y ตามข้อกำหนด เนื่องจากเราจำเป็นต้องเขียนฟิลด์ส่วนหัวเท่านั้นที่ Segyio จำเป็นต้องใช้เพื่อให้เข้าใจถึงรูปทรงเรขาคณิต ยังคงขอแนะนำอย่างยิ่งให้ดูแลและเขียนไฟล์ SEG-Y ตามข้อกำหนด แต่ segyio ไม่ บังคับใช้สิ่งนี้
Segyio สามารถจัดการไฟล์จำนวนมากที่มีลักษณะคล้าย SEG-Y กล่าวคือ segyio จัดการไฟล์ที่ไม่เป็นไปตามมาตรฐาน SEG-Y อย่างเคร่งครัด Segyio ไม่เลือกปฏิบัติระหว่างการแก้ไข แต่พยายามใช้ข้อมูลที่มีอยู่ในไฟล์แทน สำหรับการอ้างอิงมาตรฐาน ที่แท้จริง โปรดดูสิ่งพิมพ์ของ SEG:
เรายินดีรับการสนับสนุนทุกประเภท โปรดดูที่ CONTRIBUTING.md
xarray
Alan Richardson ได้เขียนเครื่องมือเล็กๆ น้อยๆ ที่ยอดเยี่ยมสำหรับการใช้ xarray กับไฟล์ segy ซึ่งเขาสาธิตไว้ในสมุดบันทึกนี้
ไฟล์รูปแบบ SEG-Y ขนาดเล็กจะรวมอยู่ในพื้นที่เก็บข้อมูลเพื่อการทดสอบ ข้อมูลไม่สมเหตุสมผลและทำให้สามารถคาดเดาได้ และสามารถทำซ้ำได้โดยใช้ Segyio ไฟล์การทดสอบอยู่ในไดเร็กทอรี test-data หากต้องการทำซ้ำไฟล์ข้อมูล ให้สร้าง segyio และรันโปรแกรมทดสอบ make-file.py
, make-ps-file.py
และ make-rotated-copies.py
ดังนี้:
python examples / make - file . py small . sgy 50 1 6 20 25
python examples / make - ps - file . py small - ps . sgy 10 1 5 1 4 1 3
python examples / make - rotated - copies . py small . sgy
ไฟล์ small-lsb.sgy ถูกสร้างขึ้นโดยการรันโปรแกรม flip-endianness โปรแกรมนี้รวมอยู่ในแผนผังซอร์ส segyio แต่ไม่ใช่ส่วนหนึ่งของแพ็คเกจ และไม่ได้มีไว้สำหรับการแจกจ่ายและการติดตั้ง เฉพาะสำหรับการสร้างไฟล์ทดสอบซ้ำเท่านั้น
ไฟล์ seismic unix small.su และ small-lsb.su ถูกสร้างขึ้นโดยคำสั่งต่อไปนี้:
segyread tape=small.sgy ns=50 remap=tracr,cdp byte=189l,193l conv=1 format=1
> small-lsb.su
suswapbytes < small.su > small-lsb.su
หากคุณมีไฟล์ข้อมูลขนาดเล็กที่มีใบอนุญาตฟรี คุณสามารถส่งไปที่โครงการได้เลย!
นำเข้าไลบรารีที่มีประโยชน์:
import segyio
import numpy as np
from shutil import copyfile
เปิดไฟล์ segy และตรวจสอบ:
filename = 'name_of_your_file.sgy'
with segyio . open ( filename ) as segyfile :
# Memory map file for faster reading (especially if file is big...)
segyfile . mmap ()
# Print binary header info
print ( segyfile . bin )
print ( segyfile . bin [ segyio . BinField . Traces ])
# Read headerword inline for trace 10
print ( segyfile . header [ 10 ][ segyio . TraceField . INLINE_3D ])
# Print inline and crossline axis
print ( segyfile . xlines )
print ( segyfile . ilines )
อ่านคิวบ์ข้อมูลหลังสแต็กที่อยู่ในไฟล์ segy:
# Read data along first xline
data = segyfile . xline [ segyfile . xlines [ 1 ]]
# Read data along last iline
data = segyfile . iline [ segyfile . ilines [ - 1 ]]
# Read data along 100th time slice
data = segyfile . depth_slice [ 100 ]
# Read data cube
data = segyio . tools . cube ( filename )
อ่านคิวบ์ข้อมูลล่วงหน้าที่มีอยู่ในไฟล์ segy:
filename = 'name_of_your_prestack_file.sgy'
with segyio . open ( filename ) as segyfile :
# Print offsets
print ( segyfile . offset )
# Read data along first iline and offset 100: data [nxl x nt]
data = segyfile . iline [ 0 , 100 ]
# Read data along first iline and all offsets gath: data [noff x nxl x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . iline [ 0 : 1 , :]])
# Read data along first 5 ilines and all offsets gath: data [noff nil x nxl x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . iline [ 0 : 5 , :]])
# Read data along first xline and all offsets gath: data [noff x nil x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . xline [ 0 : 1 , :]])
อ่านและทำความเข้าใจข้อมูลที่ 'ไม่มีโครงสร้าง' อย่างเป็นธรรม (เช่น ข้อมูลที่เรียงลำดับตามการรวบรวมแบบทั่วไป):
filename = 'name_of_your_prestack_file.sgy'
with segyio . open ( filename , ignore_geometry = True ) as segyfile :
segyfile . mmap ()
# Extract header word for all traces
sourceX = segyfile . attributes ( segyio . TraceField . SourceX )[:]
# Scatter plot sources and receivers color-coded on their number
plt . figure ()
sourceY = segyfile . attributes ( segyio . TraceField . SourceY )[:]
nsum = segyfile . attributes ( segyio . TraceField . NSummedTraces )[:]
plt . scatter ( sourceX , sourceY , c = nsum , edgecolor = 'none' )
groupX = segyfile . attributes ( segyio . TraceField . GroupX )[:]
groupY = segyfile . attributes ( segyio . TraceField . GroupY )[:]
nstack = segyfile . attributes ( segyio . TraceField . NStackedTraces )[:]
plt . scatter ( groupX , groupY , c = nstack , edgecolor = 'none' )
เขียนไฟล์ segy โดยใช้ส่วนหัวเดียวกันของไฟล์อื่น แต่คูณข้อมูลด้วย *2
input_file = 'name_of_your_input_file.sgy'
output_file = 'name_of_your_output_file.sgy'
copyfile ( input_file , output_file )
with segyio . open ( output_file , "r+" ) as src :
# multiply data by 2
for i in src . ilines :
src . iline [ i ] = 2 * src . iline [ i ]
สร้างไฟล์ segy ตั้งแต่เริ่มต้น
filename='name_of_your_file.sgy'
% Inspect segy
Segy_struct=SegySpec(filename,189,193,1);
% Read headerword inline for each trace
Segy.get_header(filename,'Inline3D')
%Read data along first xline
data= Segy.readCrossLine(Segy_struct,Segy_struct.crossline_indexes(1));
%Read cube
data=Segy.get_cube(Segy_struct);
%Write segy, use same header but multiply data by *2
input_file='input_file.sgy';
output_file='output_file.sgy';
copyfile(input_file,output_file)
data = Segy.get_traces(input_file);
data1 = 2*data;
Segy.put_traces(output_file, data1);
บ่อยครั้งที่ปัญหาเกิดขึ้นเมื่อมีคนต่อสู้กับประสิทธิภาพของ Segyio โดยเฉพาะอย่างยิ่งเมื่อสร้างไฟล์ใหม่ ผู้กระทำผิดมักเป็นรหัสนี้:
with segyio.create('new.sgy', spec) as dst:
dst.header = headers
ตัวโค้ดเองนั้นใช้ได้อย่างสมบูรณ์ แต่มีพฤติกรรมเล็กน้อยในบางระบบเมื่อไฟล์ถูกสร้างขึ้นใหม่: มันกำลังดำเนินการเขียนแบบกระจัดกระจายจำนวนมากไปยังไฟล์แบบกระจัดกระจาย การดำเนินการนี้อาจเร็วหรือช้า ขึ้นอยู่กับระบบไฟล์เป็นส่วนใหญ่
เขียนลูปใหม่เพื่อเขียนลงในไฟล์ต่อเนื่องกัน:
with segyio.create('new.sgy', spec) as dst:
for i in range(spec.tracecount):
dst.header[i] = headers[i]
dst.trace[i] = traces[i]
หากไฟล์ถูกแก้ไขสำเนาของไฟล์อื่นโดยไม่เปลี่ยนความยาวการติดตาม มักจะเร็วกว่า (และง่ายกว่า!) ในการคัดลอกไฟล์ก่อนโดยไม่มี segyio จากนั้นใช้ segyio เพื่อแก้ไขสำเนาแบบแทนที่:
shutil.copyfile(srcfile, dstfile)
with segyio.open(dstfile) as f:
f.header = headers
ข้อผิดพลาดนี้จะปรากฏขึ้นเมื่อตัวโหลดไม่พบไลบรารี segyio หลัก หากคุณได้ตั้งค่าคำนำหน้าการติดตั้งอย่างชัดเจน (ด้วย -DCMAKE_INSTALL_PREFIX
) คุณต้องกำหนดค่าตัวโหลดของคุณให้ค้นหาคำนำหน้านี้ด้วย ไม่ว่าจะด้วยไฟล์ ld.conf.d
หรือตัวแปร LD_LIBRARY_PATH
หากคุณไม่ได้ตั้งค่า CMAKE_INSTALL_PREFIX
ตามค่าเริ่มต้น cmake จะติดตั้งเป็น /usr/local
ซึ่งตัวโหลดของคุณมักจะรู้จัก บนระบบที่ใช้ Debian ไลบรารีมักจะได้รับการติดตั้ง /usr/local/lib
ซึ่งตัวโหลดอาจไม่ทราบ ดูฉบับที่ #239
sudo ldconfig
มักจะทำการหลอกลวง)-DCMAKE_INSTALL_LIBDIR=lib64
ข้อยกเว้นนี้เกิดขึ้นเมื่อ segyio พยายามเปิดในโหมดเข้มงวด ภายใต้สมมติฐานว่าไฟล์นั้นเป็นโวลุ่ม 3 มิติที่จัดเรียงตามปกติ หากไฟล์เป็นเพียงชุดของการติดตามตามลำดับ สิ่งนี้จะล้มเหลว
ตรวจสอบว่าพารามิเตอร์อินพุต segyio.open iline
และ xline
ถูกต้องสำหรับไฟล์ปัจจุบันหรือไม่ Segyio รองรับไฟล์ที่เป็นเพียงคอลเลกชันของการติดตามเช่นกัน แต่ต้องแจ้งให้ทราบว่าสามารถทำได้ ส่งผ่าน strict = False
หรือ ignore_geometry = True
ไปยัง segyio.open
เพื่ออนุญาตหรือบังคับโหมดที่ไม่มีโครงสร้างตามลำดับ โปรดทราบว่าขณะนี้ f.iline
และคุณสมบัติที่คล้ายกันถูกปิดใช้งานแล้ว และจะทำให้เกิดข้อผิดพลาด
Segyio ได้รับการเขียนขึ้นครั้งแรกและได้รับการดูแลโดย Equinor ASA ว่าเป็นวิธีการโต้ตอบกับข้อมูลแผ่นดินไหวที่ฟรี เรียบง่าย และใช้งานง่าย ซึ่งสามารถปรับให้เข้ากับความต้องการของเราได้ และเป็นส่วนสนับสนุนชุมชนซอฟต์แวร์เสรี