elsiwaveQI 2024-09-20 11:54 采纳率: 57.1%
浏览 107
已结题

建三维地震工区写入sgy到指定目录

#遇到问题的现象描述
已经建立了一个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

  • 写回答

32条回答 默认 最新

  • CSDN专家-sinJack 2024-09-25 10:26
    关注
    获得4.00元问题酬金

    第一段代码,打印的print(f"发生错误: {e}")错误信息是什么。
    第二段代码,没报错是因为没有except捕获异常信息。

    评论

报告相同问题?

问题事件

  • 系统已结题 9月28日
  • 修改了问题 9月21日
  • 赞助了问题酬金100元 9月20日
  • 创建了问题 9月20日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?