Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对异常数据格式的Python数据操作_Python_Csv_Data Files - Fatal编程技术网

针对异常数据格式的Python数据操作

针对异常数据格式的Python数据操作,python,csv,data-files,Python,Csv,Data Files,我一直在试图弄清楚如何仅使用python将这个稍微有点不寻常的格式化数据处理为可绘图格式(我一直在使用sed之类的shell脚本,但我希望长期使用python编写所有脚本,因为我通常使用的是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

我一直在试图弄清楚如何仅使用python将这个稍微有点不寻常的格式化数据处理为可绘图格式(我一直在使用sed之类的shell脚本,但我希望长期使用python编写所有脚本,因为我通常使用的是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']
回溯(最近一次呼叫最后一次): 文件“open.py”,第13行,在 column.append(第[5]行) 索引器:列表索引超出范围

在这一点上,我认为我已经把它复杂化了,我提出的任何解决方案都将非常复杂,而不是像预期的那样简化我的工作流程。“正确”的方法是什么?请并感谢您

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

不要使用csv。只需迭代文件中的行并解析每一行,检查它是否以空格开头。在空格处拆分。根据行的开头-获取所需的元素。前3行不清楚-它们是否存在于文件中?如果步骤始终为5-您可以使用它,而不是检查以哪一行开头-您肯定要使用
.readline()
而不是
.read()
方法。或者只需迭代
f
并处理行。在第4-6行中,您是否重新开始读取,直到通过标题?我想我明白了。我担心下半段我还是被卡住了。第一个问题,是拆分(0)还是拆分[0]?(对不起!)我不明白你所说的阶段列表是什么意思。是的,这三行将跳过标题。由于@buran发现了我的
read
错误,并且你注意到了
split
问题,下半场看起来更好。我们希望
拆分输入行,为所需字段编制索引,并将其转换为数字。