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

Python从数据文件创建表格仅存最后一行值:原因及解决方法

问题:Python创建表格仅保留最后一行数据的原因与解决方法

刚接触Python,创建表格时遇到基础问题。有一个example.txt文件,内容如下:

# Header information 1
# Header information 2
# Header information 3
# Header information 4
# var1  var2      var3      var4      var5
# Header information 5
# Header information 6
    1   6500.0    5.052300  1.020020  9.355021
    2   2500.7    3.038809  0.033637  1.736393
    3    750.6    5.003003  0.047254  3.287092
...
...
...
  100   2700.6    9.002800  0.088105  8.289851

希望以var1、var2等变量名作为表头创建表格,尝试了以下代码:

fnExample = open('example.txt', 'r')
i = 0
for line in fnExample:
    i = i + 1
    if i==5 :
        varExample = [word.strip() for word in line.split()]
    if (i>7 and i<100):
        dataExample = [word.strip() for word in line.split()]
        datatable[varExample[1]]=dataExample[0]
        datatable[varExample[2]]=dataExample[1]
        datatable[varExample[3]]=dataExample[2]
        datatable[varExample[4]]=dataExample[3]
        datatable[varExample[5]]=dataExample[4]

print(datatable['var1']) # gives only the last value of var1

疑问:为何datatable仅包含最后一行的值?该如何解决?


原因分析

你每次循环都直接给datatable的键赋值单个值,新值会覆盖旧值。比如datatable['var1']=dataExample[0],每处理一行数据,就用当前行的第一个值覆盖var1键之前存储的内容,循环结束后自然只保留最后一行的数据。

解决方法

应该让每个表头对应一个列表,每次循环把当前行的数据追加到对应列表中,而不是直接赋值覆盖。同时补充几个代码优化点:初始化datatable、修正行号判断避免漏掉第100行、用with语句自动管理文件关闭。

基础改进版代码

# 初始化字典,每个表头对应空列表
datatable = {
    'var1': [],
    'var2': [],
    'var3': [],
    'var4': [],
    'var5': []
}

# 使用with语句自动关闭文件
with open('example.txt', 'r') as fnExample:
    # 用enumerate直接获取行号,从1开始计数
    for line_num, line in enumerate(fnExample, start=1):
        if line_num == 5:
            varExample = [word.strip() for word in line.split()]
        elif line_num > 7:
            dataExample = [word.strip() for word in line.split()]
            # 将数据追加到对应列表,同时转换为合适的数据类型
            datatable['var1'].append(int(dataExample[0]))
            datatable['var2'].append(float(dataExample[1]))
            datatable['var3'].append(float(dataExample[2]))
            datatable['var4'].append(float(dataExample[3]))
            datatable['var5'].append(float(dataExample[4]))

# 现在打印var1会输出所有行的对应值
print(datatable['var1'])

灵活适配版代码(无需硬编码表头)

如果表头可能变化,可以通过读取到的表头动态初始化字典,避免硬编码:

datatable = {}

with open('example.txt', 'r') as fnExample:
    for line_num, line in enumerate(fnExample, start=1):
        if line_num == 5:
            varExample = [word.strip() for word in line.split()]
            # 提取表头(跳过第一个#符号)
            headers = varExample[1:]
            # 为每个表头初始化空列表
            for header in headers:
                datatable[header] = []
        elif line_num > 7:
            dataExample = [word.strip() for word in line.split()]
            # 逐个将数据追加到对应表头的列表,按需转换类型
            for idx, header in enumerate(headers):
                if idx == 0:
                    datatable[header].append(int(dataExample[idx]))
                else:
                    datatable[header].append(float(dataExample[idx]))

print(datatable['var1'])

内容的提问来源于stack exchange,提问作者Aalcon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:10:35