txt2las批量测井txt文件转las

用python批量把列格式的txt测井文件转为las格式,运行后弹出文件夹选择对话框,批量转换选择的文件夹及子文件夹下的txt文件,进度条指示转换的进度。

功能:

  1. 弹出“选择文件夹”对话框(基于 Tkinter,跨平台)。

  2. 递归遍历所选文件夹及其全部子文件夹,找出所有扩展名为 .txt 的测井文件。

  3. 假设 txt 为“列格式”,即第一行为表头(曲线名),第二行开始为数值,默认--开始的行为注释。

  4. 将每个 txt 就地生成同名的 .las 文件(LAS 2.0)。

  5. 运行完毕后给出统计信息。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
带进度条的批量 txt → LAS 转换器
"""

import os
import sys
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import threading
import numpy as np
import lasio
from tqdm import tqdm as tqdm_module

# ---------- 业务逻辑 ----------
def txt_to_las(txt_path):
    """单文件转换"""
    data = np.loadtxt(txt_path, skiprows=1)
    header = np.genfromtxt(txt_path, comments='--', max_rows=1, dtype=str)

    if data.ndim == 1:
        data = data.reshape(-1, 1)

    las = lasio.LASFile()
    las.well.WELL = os.path.splitext(os.path.basename(txt_path))[0]

    las.append_curve('DEPT', data[:, 0], unit='m')
    for i, name in enumerate(header[1:], start=1):
        las.append_curve(name.strip(), data[:, i])

    las_path = os.path.splitext(txt_path)[0] + '.las'
    las.write(las_path, version=2.0)
    return las_path

def collect_txt_files(folder):
    """递归收集所有 txt 文件"""
    txt_files = []
    for root, _, files in os.walk(folder):
        for f in files:
            if f.lower().endswith('.txt'):
                txt_files.append(os.path.join(root, f))
    return txt_files

def convert_worker(txt_files, progress_var, progress_bar, root):
    """后台线程:执行转换并更新进度"""
    total = len(txt_files)
    success = 0
    progress_var.set(0)
    progress_bar.config(maximum=total)

    # 终端进度条
    with tqdm_module(total=total, desc="Converting", unit="file") as pbar:
        for idx, txt_path in enumerate(txt_files, 1):
            try:
                txt_to_las(txt_path)
                success += 1
            except Exception as e:
                tqdm_module.write(f"失败:{txt_path}\n{e}")

            pbar.update(1)
            # 更新 GUI 进度条
            progress_var.set(idx)
            root.update_idletasks()

    messagebox.showinfo("完成", f"共 {total} 个文件,成功转换 {success} 个!")
    root.quit()

# ---------- GUI ----------
def run_gui():
    root = tk.Tk()
    root.title("txt → LAS 批量转换")
    root.geometry("400x120")
    root.resizable(False, False)

    # 进度条
    progress_var = tk.IntVar()
    progress_bar = ttk.Progressbar(root, variable=progress_var, maximum=100)
    progress_bar.pack(fill=tk.X, padx=15, pady=20)

    # 选择文件夹
    folder = filedialog.askdirectory(title="请选择包含 txt 测井文件的文件夹")
    if not folder:
        root.destroy()
        return

    txt_files = collect_txt_files(folder)
    if not txt_files:
        messagebox.showwarning("提示", "该文件夹下未发现 txt 文件!")
        root.destroy()
        return

    # 启动后台线程
    threading.Thread(
        target=convert_worker,
        args=(txt_files, progress_var, progress_bar, root),
        daemon=True
    ).start()

    root.mainloop()

# ---------- 主入口 ----------
if __name__ == '__main__':
    try:
        import lasio, numpy, tqdm
    except ImportError as e:
        messagebox.showerror("缺少依赖", f"请先安装:\n\npip install lasio numpy tqdm")
        sys.exit(1)

    run_gui()

posted @ 2025-08-30 13:14  Oliver2022  阅读(71)  评论(0)    收藏  举报  来源