#遇到问题的现象描述
已经建立了一个project,并且生成了两个文件夹SEIS和well,路径正确,有读写权限。使用python class FileWriteThread(QThread):写入sgy数据到一个指定目录时发生错误。sgy相关参数都已经定义也运行通过了,运行到class FileWriteThread(QThread):的def run(self):这部分写入sgy数据到指定目录时报错“闪退”, 没有提示错误信息。ChatGPT4也没有解决这个问题,试验了很多次。
#问题相关代码片,运行结果,报错内容
......
第一段代码
output_file = "C:/Users/info/Desktop/test66/SEIS/output.sgy"
......
try:
with segyio.open(filename, mode='r') as f:
text = f.text # 文本头部
bin = f.bin # 二进制头部
tracecount = f.tracecount # 地震道数量
samples = f.samples # 样本数组
header = f.header[:] # 地震道头部信息
trace = f.trace[:] # 地震道数据
#下面这两行跑不通
iline = getattr(f.header, 'iline', None)
xline = getattr(f.header, 'xline', None)
#下面这两行代码需要修改,报错:ValueError at trace 0: invalid literal for int() with base 10: 'INLINE_3D'
#下面这两行代码是关键,如果定义正确了,就可以跑通,请大家修改这两句
iline_value = int(trace_header['INLINE_3D']) # 转换为整数
xline_value = int(trace_header['CROSSLINE_3D']) # 转换为整数
f_data = {
'text': text,
'bin': bin,
'tracecount': tracecount,
'samples': samples,
'header': header,
'trace': trace,
'iline': iline,
'xline': xline
}
spec = {
'samples': samples,
'traces': tracecount,
'iline': np.unique(iline).astype(np.int32) if iline is not None else None,
'xline': np.unique(xline).astype(np.int32) if xline is not None else None,
}
if iline is not None and xline is not None:
try:
file_thread = FileWriteThread(output_file, f_data, iline, xline, spec) #调用多线程, spec必需有
file_thread.finished.connect(self.handle_finished) # Connect to a slot
file_thread.start() # 启动线程
except Exception as e:
print(f"发生错误: {e}") # 处理可能的异常
else:
print("Error: inlines, or crosslines is not defined.")
......
第二段代码
class FileWriteThread(QThread):
finished = Signal(str) # 信号,用于传递完成消息
def __init__(self, output_file, f_data, iline, xline):
super().__init__()
self.output_file = output_file
#self.spec = spec
self.f_data = f_data
self.iline = iline
self.xline = xline
def run(self):
try:
os.makedirs(os.path.dirname(self.output_file), exist_ok=True)
if not os.path.exists(os.path.dirname(self.output_file)):
print(f"Directory does not exist: {os.path.dirname(self.output_file)}")
print(f"Attempting to open SEGY file: {self.output_file}")
with segyio.create(self.output_file) as w: # 不传递spec , 这一行也是开始出错的开始行
# 写入文本头
w.text[0] = self.f_data['text'][0]
# 写入二进制头
w.bin.update(self.f_data['bin']) # 确保bin的格式正确
w.bin[segyio.BinField.Traces] = self.f_data['tracecount']
w.samples = self.f_data['samples']
# 写入 iline 和 xline,确保是唯一值
w.iline = np.unique(self.iline).astype(np.int32) # 确保iline是可以处理的
w.xline = np.unique(self.xline).astype(np.int32) # 确保xline是可以处理的
# 写入地震道头部和数据
print("Writing headers and traces...")
for i in range(self.f_data['tracecount']):
w.header[i] = self.f_data['header'][i]
w.trace[i] = self.f_data['trace'][i]
self.finished.emit(f"Data has been written to {self.output_file}")
#我的初步解答思路是
在MainWindow中通过一个def open_segy_file(self):定义sgy数据道头信息和参数,然后通过file_thread = FileWriteThread(output_file, f_data, iline, xline) 调用class FileWriteThread(QThread):,将sgy数据写入指定目录./SEIS
#操作环境、软件版本等相关信息
Win11操作系统,Python3.10,使用PySide2架构写的GUI