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
相关产品推荐
相关产品推荐

