我正在尝试读取包含各种数据的文件和文件。 下面给出了文件类型的示例。
[CIRCUIT1]
CIRCUITNAME=CIRCUIT1
00.12 12/20 2.3 23.6
00.12 12/20 2.3 23.6
00.42 12/20 2.2 23.3
00.42 12/20 2.2 23.3
[CIRCUIT2]
CIRCUITNAME=CIRCUIT2
00.12 12/20 2.2 26.7
00.12 12/20 2.2 26.7
00.42 12/20 2.2 26.5
00.42 12/20 2.2 26.5
00.42 12/20 2.2 26.5
[AMBIENT]
00.42 12/20 8.6
01.42 12/20 8.6
02.42 12/20 8.6
03.42 12/20 8.7
04.42 12/20 8.8
05.42 12/20 8.6
06.42 12/20 8.7
现在,我已经定义了一个只返回circuit1的第3和第4列的函数。 但应返回日期和时间格式,稍后将对其进行定义。但是我的索引超出范围错误。
def load_ci(filepath):
fileObj=open(filepath, 'r')
time_1=[],time_2=[],t=0,ti=0,loadCurrent_1=[],surfaceTemp_1=[],loadCurrent_2=[],surfaceTemp_2=[],ambient=[]
read=0
for line in fileObj:
if not line.strip():
continue
if read==1:
if '[AMBIENT]' in line:
read=3
continue
elif 'CIRCUITNAME=CIRCUIT2' in line: read=2
else:
if line!='\n' and '[CIRCUIT2]' not in line:
point=line.split(' ')
t=(float(point[0]))
ti=int(t)*3600+(t-int(t))*60*100
time_1.append(ti)
loadCurrent_1.append(float(point[2]))
surfaceTemp_1.append(float(point[3]))
if read==2:
if '[AMBIENT]' in line:
read=3
continue
elif 'CIRCUITNAME=CIRCUIT2' in line: read=2
else:
if line!='\n' and '[CIRCUIT2]' not in line:
point=line.split(' ')
t=(float(point[0]))
ti=int(t)*3600+(t-int(t))*60*100
time_2.append(ti)
loadCurrent_2.append(float(point[2]))
surfaceTemp_2.append(float(point[3]))
if read==3:
if line!='\n':
point=line.split(' ')
ambient.append(float(point[2]))
if 'CIRCUITNAME=CIRCUIT1' in line: read=1
return np.array(loadCurrent_1),np.array(surfaceTemp_1),np.array(loadCurrent_2),np.array(surfaceTemp_2),np.array(ambient),np.array(time_1),np.array(time_2)
答案 0 :(得分:0)
检测到包含[AMBIENT]的行后,您需要前进到下一行,同时将读取状态更改为3.在读取= 3后添加继续语句代码中的两个点,您检查[AMBIENT]
此外,从
更改[CIRCUIT2]的代码检查if line != '\n' and line != '[CIRCUIT2]':
到
if line != '\n' and '[CIRCUIT2]' not in line:
如果您想忽略空行,可以在循环开头添加一个检查,如:
if not line.strip():
continue
我在问题中重新设计了代码,以便从环境数据中分解出电路,简化状态管理。我传递文件对象,利用其迭代状态来跟踪我们在任何给定点的文件中的位置。文件的部分以'[...]'开头,以空行结束,所以我可以利用它。为方便起见,我将所有电路数据分组到一个字典中,但是如果你愿意的话,这可以归成一个完整的类。
import numpy as np
def parseCircuit(it, header):
loadCurrent, surfaceTemp, time = [], [], []
for line in it:
line = line.strip()
if not line:
break
elif line.startswith('CIRCUITNAME='):
name = line[12:]
else:
point=line.split(' ')
h, m = map(int, point[0].split('.'))
time.append(h * 3600 + m * 60)
loadCurrent.append(float(point[2]))
surfaceTemp.append(float(point[3]))
return {'name': name,
'surfaceTemp': np.array(surfaceTemp),
'loadCurrent': np.array(loadCurrent),
'time': np.array(time)}
def parseAmbient(it, header):
ambient = []
for line in it:
line = line.strip()
if not line:
break
point=line.split(' ')
ambient.append(float(point[2]))
return np.array(ambient)
def load_ci(filepath):
fileObj=open(filepath, 'r')
circuits = {}
ambient = None
for line in fileObj:
line = line.strip() # remove \n from end of line
if not line: # skip empty lines
continue
if line.startswith('[CIRCUIT'):
circuit = parseCircuit(fileObj, line)
circuits[circuit['name']] = circuit
elif line.startswith('[AMBIENT'):
ambient = parseAmbient(fileObj, line)
return circuits, ambient
print load_ci('test.ci')
输出
({'CIRCUIT2': {'loadCurrent': array([ 2.2, 2.2, 2.2, 2.2, 2.2]), 'surfaceTemp': array([ 26.7, 26.7, 26.5, 26.5, 26.5]), 'name': 'CIRCUIT2', 'time': array([ 720, 720, 2520, 2520, 2520])}, 'CIRCUIT1': {'loadCurrent': array([ 2.3, 2.3, 2.2, 2.2]), 'surfaceTemp': array([ 23.6, 23.6, 23.3, 23.3]), 'name': 'CIRCUIT1', 'time': array([ 720, 720, 2520, 2520])}}, array([ 8.6, 8.6, 8.6, 8.7, 8.8, 8.6, 8.7]))