You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python依据txt文件Wave列循环值添加Intensity新列整理光谱

处理循环Wave数据,将多轮Intensity转为多列

原代码问题分析

你提供的代码存在几个核心逻辑错误,导致无法实现需求:

  • 错误以X列(valores[0])作为循环判断依据,而实际应该基于Wave列(valores[2])的循环规律
  • 错误包含了不需要的Y列,且数据拼接逻辑混乱,导致行列结构完全不符合预期
  • 未正确跟踪Wave的循环周期,无法区分不同轮次的Intensity数据

修正后的实现代码

def procesar_archivo(archivo_entrada, archivo_salida):
    # 存储每个波数对应的各轮次强度:键为Wave值,值为强度列表
    wave_intensity_map = {}
    prev_wave = None
    cycle_count = 0

    with open(archivo_entrada, 'r') as entrada:
        # 若输入文件无表头,注释掉此行
        next(entrada)
        for linea in entrada:
            valores = linea.strip().split('\t')
            if len(valores) < 4:
                continue  # 跳过无效行
            
            wave = valores[2]
            intensity = valores[3]

            # 检测新循环:当当前波数小于上一个波数时,判定进入新轮次
            if prev_wave is not None and float(wave) < float(prev_wave):
                cycle_count += 1
            
            # 初始化当前波数的强度列表(首次出现时)
            if wave not in wave_intensity_map:
                wave_intensity_map[wave] = []
            
            # 将当前强度加入对应波数的列表
            wave_intensity_map[wave].append(intensity)
            
            prev_wave = wave

    # 获取总循环次数(取最长强度列表的长度,兼容部分波数缺失数据的情况)
    total_cycles = max(len(intensities) for intensities in wave_intensity_map.values()) if wave_intensity_map else 0

    # 写入输出文件
    with open(archivo_salida, 'w') as salida:
        # 生成表头
        header = ['Wave'] + [f'Sample {i+1}' for i in range(total_cycles)]
        salida.write('\t'.join(header) + '\n')
        
        # 按波数数值排序后写入数据
        sorted_waves = sorted(wave_intensity_map.keys(), key=lambda x: float(x))
        for wave in sorted_waves:
            intensities = wave_intensity_map[wave]
            # 补全缺失数据(用空字符串填充)
            while len(intensities) < total_cycles:
                intensities.append('')
            linea = [wave] + intensities
            salida.write('\t'.join(linea) + '\n')

    print("Procesamiento completado.")

代码核心逻辑说明

  1. 字典存储机制:wave_intensity_map 确保每个Wave对应的所有轮次Intensity被收集到同一列表中,自动匹配波数与对应强度
  2. 循环检测:利用Wave先递增后重复的规律,通过比较当前Wave与前一个Wave的数值大小,精准判断新循环的启动
  3. 数据补全:针对部分波数可能缺失某轮数据的情况,自动补全空字符串,保证输出列数一致
  4. 有序输出:最后按Wave的数值大小排序输出,保持波数的递增顺序,符合数据展示习惯

使用示例

直接调用函数并传入输入、输出文件路径即可:

procesar_archivo('tu_archivo_entrada.txt', 'tu_archivo_salida.txt')

内容的提问来源于stack exchange,提问作者Adrián Rivas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:22:33