如何用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.")
代码核心逻辑说明
- 字典存储机制:
wave_intensity_map确保每个Wave对应的所有轮次Intensity被收集到同一列表中,自动匹配波数与对应强度 - 循环检测:利用Wave先递增后重复的规律,通过比较当前Wave与前一个Wave的数值大小,精准判断新循环的启动
- 数据补全:针对部分波数可能缺失某轮数据的情况,自动补全空字符串,保证输出列数一致
- 有序输出:最后按Wave的数值大小排序输出,保持波数的递增顺序,符合数据展示习惯
使用示例
直接调用函数并传入输入、输出文件路径即可:
procesar_archivo('tu_archivo_entrada.txt', 'tu_archivo_salida.txt')
内容的提问来源于stack exchange,提问作者Adrián Rivas
相关产品推荐
相关产品推荐

