我想在极坐标图中绘制一些数据,并且如果我从其中包含任何标题或文本的简单txt文件中导入数据,我编写的代码非常有用。 问题是我从自动设备获取数据的格式如下:
Hello word
Hi Again
Angle [deg] Level of radiation
-180 -1
-175 -8.17
-170 -15
-165 -13.67
目前,我使用以下代码导入数据,但是如果有文本或标题不起作用:
for line in open(Data.txt, 'r'):
values = [float(s) for s in line.split()]
Position.append(values[0])
Level.append(values[1])
NormalizedLevel.append(values[2])
我的目标是将前两行存储为要在绘图中显示的文本,然后将后三列存储在三个不同的数组中。如果可能的话,每个数组的名称应该是列的标题,但是如果不可能的话,这不是大问题!
有什么想法吗?预先感谢!
答案 0 :(得分:1)
跳过标题。如果您知道标题中有几行,则可以执行以下操作:
with open('Data.txt', 'r') as ff:
lines = ff.readlines()
for ll in lines[3:] #if you have 3 lines of header as in your example
values = [float(s) for s in ll.split()]
Position.append(values[0])
Level.append(values[1])
NormalizedLevel.append(values[2])
您可以从lines[:3]
(在这种情况下)获取标头以供以后使用。这是列表。
如果您不知道标题行的数量,可以使用以下代码:
header = []
with open('data.txt', 'r') as ff:
lines = ff.readlines()
for ll in lines:
try:
values = [float(s) for s in ll.split()]
Position.append(values[0])
Level.append(values[1])
NormalizedLevel.append(values[2])
except ValueError:
header.append(ll)
基本上,您尝试分割字符串并将列表的条目转换为浮点型。如果出现问题,则会引发ValueError
异常。该代码假定该行是标题行,并将其存储在适当的列表中。
由于您要处理的是可变格式,因此我认为这是最好的选择。
答案 1 :(得分:1)
在标题行数可变的情况下,您需要首先计算您拥有的numberOfHeaderLines
。一旦知道了这一点,就可以使用数组切片来提取其余数据。
with open('Data.txt', 'r') as file:
lines = file.readlines()
numberOfHeaderLines = 0
for line in lines
values = lines.split()
# perhaps store your header data somewhere
if (values[0].isdigit())
break; # exit this loop now we know we're at a data row
numberOfHeaderLines++ # increment
for line in lines[numberOfHeaderLines:]
values = [float(s) for s in lines.split()]
Position.append(values[0])
Level.append(values[1])
NormalizedLevel.append(values[2])
可能有更简洁的方法来执行此操作,但是(1)我不是Python专家,并且(2)如果您是编程新手,那么了解这样的基本方法很重要,因为这些基本方法与语言无关