使用numpy.genfromtxt读取pdbqt文件时如何忽略列数异常行?
解决pdbqt转txt时np.genfromtxt列数不匹配的问题
问题背景
使用np.genfromtxt读取pdbqt文件时,因部分行列数不符合预期触发ValueError报错,需要跳过这些格式异常的行完成文件转换。
修正后的代码
from __future__ import division import numpy as np import glob def pdbqt_to_txt(filename): # 读取指定列,忽略格式错误的行 data = np.genfromtxt( filename, dtype=float, usecols=(6, 7, 8), skip_footer=1, invalid_raise=False # 核心:遇到错误行不抛出异常,填充为NaN ) # 过滤掉包含NaN的无效行 valid_data = data[~np.isnan(data).any(axis=1)] # 生成输出文件名并保存 output_name = filename.replace('.pdbqt', '.txt') np.savetxt(output_name, valid_data, fmt='%.6f') # 获取所有pdbqt文件 all_files = glob.glob('*.pdbqt') print(all_files) # 批量处理 for file in all_files: pdbqt_to_txt(file)
关键调整说明
invalid_raise=False:关闭genfromtxt的错误抛出机制,遇到列数不匹配、无法转换为浮点型的行时,会将该行数据填充为NaN而非直接报错。- 过滤NaN行:通过
~np.isnan(data).any(axis=1)筛选出所有无NaN的有效行,确保输出的txt文件只包含符合格式的数据。 - 冗余代码清理:移除原脚本中重复的
os导入和重复赋值的all_filenames,直接用glob获取目标文件更高效。 - 补充输出逻辑:原脚本仅读取数据未保存,新增
np.savetxt完成txt文件输出,可通过fmt参数调整输出精度。
额外提示
如果pdbqt文件开头存在注释类非数据行,可在genfromtxt中添加skip_header=N参数(N为需要跳过的行数),确保只读取有效数据段。
内容的提问来源于stack exchange,提问作者user3765252
相关产品推荐
相关产品推荐

