异常数据格式的Python数据处理

问题描述

我一直在试图找出如何仅使用python将这些格式略有不同寻常的数据转换为可绘制表格格式的方法(我一直在使用sed之类的shell脚本进行处理,但是我想做所有我长期使用python编写脚本,因为这是我通常使用的语言。)

我的数据如下:

# Title of File
# step number_of_slices total_a
# slice Coord N v
51000 5 240000
  1 0.025 12003 0.0255628 
  2 0.075 11991 0.0257368
  3 0.125 11989 0.0258158
  4 0.175 11997.2 0.0259262
  5 0.225 11995.8 0.0258637
52000 5 240000
  1 0.025 12004.7 0.0251662
  2 0.075 11998.7 0.0256496
  3 0.125 11996.3 0.025816
  4 0.175 11994 0.0259593
  5 0.225 12008.3 0.0258245
  .
  .
  .
1010000 5 240000                                                                                                   
  1 0.025 12304.6 0.0182998                                                                                                     
  2 0.075 12146.1 0.0195533                                                                                         
  3 0.125 12026.9 0.0211158                                                                                         
  4 0.175 12003.5 0.0228836                                                                                         
  5 0.225 12000.3 0.0242854

我想将仅第四列的数据附加到每个“步骤”的单个文件中,即

Steps 51000 52000 ... 1010000
1 0.0255628 0.0251662 ... 0.0182998
2 0.0257368 0.025816 ... 0.0195533
3 0.0258158 0.0259593 ... 0.0211158
4 0.0259262 0.0258245 ... 0.0228836
5 0.0258637 0.0258245 ... 0.0242854

在bash中,这非常容易。我每6行剪切第四列并附加到新文件中。但是我无法终生想出如何仅用python来做到这一点。

这是我得到的最好成绩:

import csv

f = open('file.dat')
csv_f = csv.reader(f,delimiter = " ")

column = []

for row in csv_f:
        column.append(row[5])
print column

f.close()

5是因为我最后两列为空(我想这是一种格式化的东西),但是由于某些行只有3个元素,这给了我一个错误,所以我什至无法隔离该列才能开始得到我想要的格式:

['51000','20','240000']
['','','1','0.025','12003','0.0255628']
['','2','0.075','11991','0.0257368']
['','3','0.125','11989','0.0258158']
['','4','0.175','11997.2','0.0259262']
['','5','0.225','11995.8','0.0258637']

回溯(最近通话最近): 在第13行的文件“ open.py”中 column.append(row [5]) IndexError:列表索引超出范围

在这一点上,我认为我已经使它过于复杂了,我想出的任何解决方案都会非常复杂,而不是像预期的那样简化我的工作流程。什么是“正确”方式?拜托,谢谢你

解决方法

以6行数据包的形式简单“打包”您的输入。将数据归档到并行列表中。 甚至不用理会CSV阅读器;您不需要结构。

step = []
value = [[] for _ in range(5)]  # initialize 5 value lists

with open('file.dat') as f:
    for _ in range(num_of_header_lines):
        f.readline()

    while # not f.EOF
        # extract step: first value on the line
        step.append(int(f.readline().split()[0]))
        for phase in range(5):
            # Extract the last value for the appropriate phase list
            value[phase].append(float(f.readline().split()[-1]))

我已经为您保留了文件初始化和EOF详细信息-这是内部逻辑。 您抓住一行,并将步骤编号附加到步骤列表中。然后再读五行,从每行的相应子列表中获取最后一个值。