针对异常数据格式的Python数据操作
我一直在试图弄清楚如何仅使用python将这个稍微有点不寻常的格式化数据处理为可绘图格式(我一直在使用sed之类的shell脚本,但我希望长期使用python编写所有脚本,因为我通常使用的是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
# 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
问题,下半场看起来更好。我们希望拆分输入行,为所需字段编制索引,并将其转换为数字。