txt2las批量测井txt文件转las
用python批量把列格式的txt测井文件转为las格式,运行后弹出文件夹选择对话框,批量转换选择的文件夹及子文件夹下的txt文件,进度条指示转换的进度。
功能:
弹出“选择文件夹”对话框(基于 Tkinter,跨平台)。
递归遍历所选文件夹及其全部子文件夹,找出所有扩展名为 .txt 的测井文件。
假设 txt 为“列格式”,即第一行为表头(曲线名),第二行开始为数值,默认--开始的行为注释。
将每个 txt 就地生成同名的 .las 文件(LAS 2.0)。
运行完毕后给出统计信息。
#!/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_pathdef 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_filesdef convert_worker(txt_files, progress_var, progress_bar, root):"""后台线程:执行转换并更新进度"""total = len(txt_files)success = 0progress_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 += 1except 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()returntxt_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, tqdmexcept ImportError as e:messagebox.showerror("缺少依赖", f"请先安装:\n\npip install lasio numpy tqdm")sys.exit(1)run_gui()