Python读取含Fortran D格式科学计数法的TXT文件转DataFrame问题
解决Fortran格式科学计数法转DataFrame的问题
我有一个包含10列的TXT文件,想要将其读取为DataFrame。但文件中的数值是Fortran程序输出的特殊科学计数法格式(例如9.677975573367686D+00),无法直接转换为float类型。
尝试过以下代码均未生效:
data = np.loadtxt('data.txt', converters={0: lambda s: s.replace(b'D', b'E')})float(val.replace('D', 'E'))
可行解决方案
方案1:全局替换后用Pandas读取
先一次性替换文件中所有的D为E,再用Pandas按空格分隔读取:
import pandas as pd with open('data.txt', 'r') as f: processed_content = f.read().replace('D', 'E') # 用StringIO模拟文件对象传入read_csv,按任意空白字符分隔列 df = pd.read_csv(pd.compat.StringIO(processed_content), sep='\s+', header=None)
方案2:给每列指定转换器
针对10列分别设置转换器,处理Fortran格式的数值:
import pandas as pd def fortran_to_float(value): return float(value.replace('D', 'E')) # 为0到9列都绑定转换器 converter_dict = {col: fortran_to_float for col in range(10)} df = pd.read_csv('data.txt', sep='\s+', header=None, converters=converter_dict)
方案3:用Numpy处理后转DataFrame
如果习惯用Numpy读取,注意处理字节串转字符串的问题:
import numpy as np import pandas as pd def convert_byte_str(s): # Numpy读取返回字节串,先解码为字符串再替换 return float(s.decode('utf-8').replace('D', 'E')) # 给所有10列设置转换器 data_array = np.genfromtxt('data.txt', converters={i: convert_byte_str for i in range(10)}) df = pd.DataFrame(data_array)
原代码失效原因说明
- 第一个代码仅处理了第0列,剩余9列未做转换,导致整体读取失败;
- 第二个代码如果是在未正确处理字节串的场景下使用(比如Numpy返回的是
bytes类型而非字符串),直接调用replace('D', 'E')会报错,需要先解码为字符串。
内容的提问来源于stack exchange,提问作者Hamid
相关产品推荐
相关产品推荐

