#遇到问题的现象描述
任务是写segy数据到指定目录,中间一个任务出错了。首先打开segy文件读取必要的参数,其中一个text参数很特殊,在with块内读取后其它参数如trace、num_samples都能够在with块外正常调用。为了解决text在with块外调用问题,chatgpt4o建议构造一个def函数,
return (num_samples, trace),这样在with块外就能正常调用。但实际运行结果却未能所愿,还是报错文件已关闭,不能调用。希望有人能找出问题原因或给出一个可行的解决方案,能够在with块外正常调用text文件。
#问题相关代码片,运行结果,报错内容
相关代码:
def read_segy_text(filename):
#读取 SEG-Y 文件并提取文本信息
try:
#打开 SEG-Y 文件
text = None
with segyio.open(filename, mode='r', ignore_geometry = False) as f:
# 读取必要的信息
print("读取必要信息")
text = f.text if f.text else "没有文本信息"
num_samples = len(f.samples)
trace = np.array([f.trace[i] for i in range(len(f.trace))]) # 保持为 NumPy 数组
print("with块内打印text",text)
return (num_samples, trace, text)
except FileNotFoundError:
return None # 处理文件未找到情况
except OSError as e:
return None # 处理 I/O 错误
except Exception as e:
return None # 处理其他错误
filename, _ = QFileDialog.getOpenFileName(self, "Open SEGY File", "", "SEGY Files (*.sgy *.segy)")
result = read_segy_text(filename)
if result is not None and len(result) == 3:
num_samples, trace, text = result
print("打印检查 text")
print(num_samples)
if trace is not None:
print("打印检查 trace 的前10个样本如果有)")
print(trace[:10]) # 打印 trace 的前10个样本以避免输出过多
print("text:", text)
else:
print("返回值的数量不匹配,实际数量:", len(result) if result is not None else 'None')
运行结果:
MainWindow initialized
Application started
Save button clicked
读取必要信息
with块内打印text bytearray(b'C 1 CLIENT COMPANY CREW NO.
C 2 LINE AREA MAP ID.
C 3 REEL NO. DAY-START OF REEL YEAR OBSERVER
C 4 INSTRUMENT: MFG MODEL SERIAL NO.
C 5 DATA TRACES/RECORD AUXILIARY TRACES/RECORD CDP FOLD
C 6 SAMPLE INTERVAL MS SAMPLES/TRACE BITS/IN BYTES/SAMP
LE C 7 RECORDING FORMAT FORMAT THIS REEL MEASUREMENT SYSTEM
C 8 SAMPLE CODE: FLOATING PT FIXED PT FIXED PT-GAIN CORR
ELATED C 9 GAIN TYPE: FIXED BINARY FLOATING POINT OTHER
C10 FILTERS: ALIAS HZ NOTCH HZ BAND HZ SLOPE
C11 SOURCE: TYPE NUMBER/POINT POINT INTERVAL
C12 PATTERN LENGTH WIDTH
C13 SWEEP: START HZ END HZ LENGTH MS CHANNEL NO. T
YPE C14 TAPER: START LENGTH MS END LENGTH MS TYPE
C15 SPREAD: OFFSET MAX DISTANCE GROUP INTERVAL
C16 GEOPHONES: PER GROUP SPACING FREQUENCY MFG MODEL
C17 PATTERN LENGTH WIDTH
C18 TRACES SORTED BY: RECORD CDP OTHER
C19 MAP PROJECTION ZONE ID COORDINATE UNITS
C20 BEGINNING SHOTPOINT (OBSERVER-S):
C21 ENDING SHOTPOINT (OBSERVER-S):
C22 DIRECTION OF LINE:
C23 COUNTY STATE SURVEY NO.
C24
C25
C26
C27
C28
C29
C30
C31
C32
C33
C34
C35
C36
C37
C38
C39
C40
打印检查 text
751
打印检查 trace 的前10个样本(如果有)
[[ 0. 0. 0. ... 116.98076 17.057678
-284.78833 ]
[ 0. 0. 0. ... -76.63461 -58.711533
-151.21153 ]
[ 0. 0. 0. ... -51.86537 -114.63461
-197.3077 ]
...
[ 0. 0. 0. ... 31.07692 1.5576916
113.096146 ]
[ 0. 0. 0. ... 417.88452 306.46143
168.11539 ]
[ 0. 0. 0. ... 360.4807 488.25
480.67285 ]]
开始创建local_f_data字典和segyio.spec
构建spec
报错内容:
print("text:", text)
OSError: I/O operation on closed file
#我的初步解答思路是
目前没有找到解答思路
#操作环境、软件版本等相关信息
win11、python3.10、segyio 1.9.12