【问题标题】:Python data manipulation for unusual data format针对异常数据格式的 Python 数据操作
【发布时间】:2021-01-04 17:02:31
【问题描述】:

我一直在试图弄清楚如何仅使用 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']

Traceback(最近一次调用最后一次): 文件“open.py”,第 13 行,在 column.append(行[5]) IndexError: 列表索引超出范围

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

【问题讨论】:

  • 不使用 csv。只需遍历文件中的行并解析每一行 - 检查它是否以空格开头。在空格处分割。取决于行的开头 - 取你想要的元素。前 3 行不清楚 - 它们是否存在于文件中?
  • 如果步骤总是 5 - 你可以使用它而不是检查哪一行开始

标签: python csv data-files


【解决方案1】:

只需将您的输入“分块”成 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 详细信息——这是内部逻辑。 您抓住一行并将步骤编号附加到步骤列表中。然后你又读了五行,从每行中提取最后一个值作为对应的子列表。

【讨论】:

  • 你肯定想使用.readline() 而不是.read() 方法。或者只是遍历f 并处理这些行。
  • 在第 4-6 行中,您是否重新开始阅读,直到您通过标题?我想我明白了。
  • 恐怕后半段还是卡住了。第一个问题,是 split(0) 不是 split[0] 吗? (抱歉!)我不明白你所说的阶段列表是什么意思。
  • 是的,这三行是跳过标题。由于@buran 发现了我的read 错误,并且您注意到split 问题,后半部分看起来更好。我们想split 输入行,索引 one 所需的字段,并将其转换为数字。
猜你喜欢
  • 2019-01-21
  • 1970-01-01
  • 2016-12-08
  • 2015-10-14
  • 2023-01-20
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多