如何根据Python中的前一行/字符串获取字符串中字符的位置?
我必须解析一个文件,该文件包含我需要在数据帧中放入/排序的数据。下面是我解析的部分文件的示例:如何根据Python中的前一行/字符串获取字符串中字符的位置?,python,pandas,parsing,text-parsing,Python,Pandas,Parsing,Text Parsing,我必须解析一个文件,该文件包含我需要在数据帧中放入/排序的数据。下面是我解析的部分文件的示例: TEST#结果单元上下报警测试名称 ------ -------------- -------- -------------- -------------- ----- ---------- 1.0 1234测试名称1 1.1 H647333测试名称2 1.2 30摄氏度总温度 1.3 1碳纳米管谷物 1.4 364003 cnt POINTNUM 1.5 20200505 cnt日期 1.6 174
TEST#结果单元上下报警测试名称
------ -------------- -------- -------------- -------------- ----- ----------
1.0 1234测试名称1
1.1 H647333测试名称2
1.2 30摄氏度总温度
1.3 1碳纳米管谷物
1.4 364003 cnt POINTNUM
1.5 20200505 cnt日期
1.6 174143碳纳米管时间
1.7 2.020051e+007 cnt日期时间
1.8 123碳纳米管表面贴装技术
1.9 23.16 C温度1
1.10 23.55 C 123 TEMP2
1.11 22.88 C-23 TEMP3
1.12 22.86摄氏度温度4
1.13 1.406米-1.450 1.500距离1
1.14 0.718米-0.800 0.350故障距离2
我的问题是:如何解释有下限但没有上限,或者有上限但没有下限?
注意:我的实际文本文件没有这种情况,但我的应用程序\项目调用了可能发生这种情况的实例
我如何检查每一行如下:
line = file_object.readline()
while line.strip():
# extract data from line and format all info in one list
xline = line.strip().split()
# the length of the info list of the line read
# is correlated to the data
if len(xline) == 3:
number = xline[0]
results = xline[1]
testname = xline[2]
units = None
lower = None
upper = None
# alarm = None
elif len(xline) == 4:
number = xline[0]
results = xline[1]
units = xline[2]
testname = xline[3]
lower = None
upper = None
# alarm = None
elif len(xline) == 6:
number = xline[0]
results = xline[1]
units = xline[2]
lower = xline[3]
upper = xline[4]
testname = xline[5]
# alarm = None
elif len(xline) == 7:
number = xline[0]
results = xline[1]
units = xline[2]
lower = xline[3]
upper = xline[4]
# alarm = xline[5]
testname = xline[6]
# create a dictionary containing this row of data
row = {
'Test #': number,
'Result': results,
'Units': units,
'Lower Limit': lower,
'Upper Limit': upper,
# 'Alarm': alarm,
'Test Name': testname,
}
data.append(row)
line = file_object.readline()
我的想法是将读取的每一行数据与“测试结果单元上下报警测试名称”行标题位置进行比较,但我不知道如何做到这一点。如果有人能给我指出一个可行的方向,那就太好了
编辑:文件并非仅采用上述表格格式。我的文件在文件的开头有一大堆交错的块文本。以及多个“表格”,它们之间有交错的块文本。您可以使用,
pd.read\u fwf
:
df = pd.read_fwf(inputtxt,'infer')
输出:
TEST# RESULT UNITS LOWER UPPER ALARM TEST NAME
0 ------ -------------- -------- -------------- -------------- ----- ----------
1 1.0 1234 NaN NaN NaN NaN TESTNAME1
2 1.1 H647333 NaN NaN NaN NaN TESTNAME2
3 1.2 30 C NaN NaN NaN TEMPTOTAL
4 1.3 1 cnt NaN NaN NaN CEREAL
5 1.4 364003 cnt NaN NaN NaN POINTNUM
6 1.5 20200505 cnt NaN NaN NaN Date
7 1.6 174143 cnt NaN NaN NaN Time
8 1.7 2.020051e+007 cnt NaN NaN NaN DateTime
9 1.8 123 cnt NaN NaN NaN SMT
10 1.9 23.16 C NaN NaN NaN TEMP1
11 1.10 23.55 C NaN 123 NaN TEMP2
12 1.11 22.88 C -23 NaN NaN TEMP3
13 1.12 22.86 C NaN NaN NaN TEMP4
14 1.13 1.406 Meter -1.450 1.500 NaN DIST1
15 1.14 0.718 Meter -0.800 0.350 FAIL DIST2
TEST# RESULT UNITS LOWER UPPER ALARM TEST NAME
1 1.0 1234 NaN NaN NaN NaN TESTNAME1
2 1.1 H647333 NaN NaN NaN NaN TESTNAME2
3 1.2 30 C NaN NaN NaN TEMPTOTAL
4 1.3 1 cnt NaN NaN NaN CEREAL
5 1.4 364003 cnt NaN NaN NaN POINTNUM
6 1.5 20200505 cnt NaN NaN NaN Date
7 1.6 174143 cnt NaN NaN NaN Time
8 1.7 2.020051e+007 cnt NaN NaN NaN DateTime
9 1.8 123 cnt NaN NaN NaN SMT
10 1.9 23.16 C NaN NaN NaN TEMP1
11 1.10 23.55 C NaN 123 NaN TEMP2
12 1.11 22.88 C -23 NaN NaN TEMP3
13 1.12 22.86 C NaN NaN NaN TEMP4
14 1.13 1.406 Meter -1.450 1.500 NaN DIST1
15 1.14 0.718 Meter -0.800 0.350 FAIL DIST2
并且,您可以删除索引0以获得虚线:
df = df.drop(0)
输出:
TEST# RESULT UNITS LOWER UPPER ALARM TEST NAME
0 ------ -------------- -------- -------------- -------------- ----- ----------
1 1.0 1234 NaN NaN NaN NaN TESTNAME1
2 1.1 H647333 NaN NaN NaN NaN TESTNAME2
3 1.2 30 C NaN NaN NaN TEMPTOTAL
4 1.3 1 cnt NaN NaN NaN CEREAL
5 1.4 364003 cnt NaN NaN NaN POINTNUM
6 1.5 20200505 cnt NaN NaN NaN Date
7 1.6 174143 cnt NaN NaN NaN Time
8 1.7 2.020051e+007 cnt NaN NaN NaN DateTime
9 1.8 123 cnt NaN NaN NaN SMT
10 1.9 23.16 C NaN NaN NaN TEMP1
11 1.10 23.55 C NaN 123 NaN TEMP2
12 1.11 22.88 C -23 NaN NaN TEMP3
13 1.12 22.86 C NaN NaN NaN TEMP4
14 1.13 1.406 Meter -1.450 1.500 NaN DIST1
15 1.14 0.718 Meter -0.800 0.350 FAIL DIST2
TEST# RESULT UNITS LOWER UPPER ALARM TEST NAME
1 1.0 1234 NaN NaN NaN NaN TESTNAME1
2 1.1 H647333 NaN NaN NaN NaN TESTNAME2
3 1.2 30 C NaN NaN NaN TEMPTOTAL
4 1.3 1 cnt NaN NaN NaN CEREAL
5 1.4 364003 cnt NaN NaN NaN POINTNUM
6 1.5 20200505 cnt NaN NaN NaN Date
7 1.6 174143 cnt NaN NaN NaN Time
8 1.7 2.020051e+007 cnt NaN NaN NaN DateTime
9 1.8 123 cnt NaN NaN NaN SMT
10 1.9 23.16 C NaN NaN NaN TEMP1
11 1.10 23.55 C NaN 123 NaN TEMP2
12 1.11 22.88 C -23 NaN NaN TEMP3
13 1.12 22.86 C NaN NaN NaN TEMP4
14 1.13 1.406 Meter -1.450 1.500 NaN DIST1
15 1.14 0.718 Meter -0.800 0.350 FAIL DIST2
您可以使用,
pd.read\u fwf
:
df = pd.read_fwf(inputtxt,'infer')
输出:
TEST# RESULT UNITS LOWER UPPER ALARM TEST NAME
0 ------ -------------- -------- -------------- -------------- ----- ----------
1 1.0 1234 NaN NaN NaN NaN TESTNAME1
2 1.1 H647333 NaN NaN NaN NaN TESTNAME2
3 1.2 30 C NaN NaN NaN TEMPTOTAL
4 1.3 1 cnt NaN NaN NaN CEREAL
5 1.4 364003 cnt NaN NaN NaN POINTNUM
6 1.5 20200505 cnt NaN NaN NaN Date
7 1.6 174143 cnt NaN NaN NaN Time
8 1.7 2.020051e+007 cnt NaN NaN NaN DateTime
9 1.8 123 cnt NaN NaN NaN SMT
10 1.9 23.16 C NaN NaN NaN TEMP1
11 1.10 23.55 C NaN 123 NaN TEMP2
12 1.11 22.88 C -23 NaN NaN TEMP3
13 1.12 22.86 C NaN NaN NaN TEMP4
14 1.13 1.406 Meter -1.450 1.500 NaN DIST1
15 1.14 0.718 Meter -0.800 0.350 FAIL DIST2
TEST# RESULT UNITS LOWER UPPER ALARM TEST NAME
1 1.0 1234 NaN NaN NaN NaN TESTNAME1
2 1.1 H647333 NaN NaN NaN NaN TESTNAME2
3 1.2 30 C NaN NaN NaN TEMPTOTAL
4 1.3 1 cnt NaN NaN NaN CEREAL
5 1.4 364003 cnt NaN NaN NaN POINTNUM
6 1.5 20200505 cnt NaN NaN NaN Date
7 1.6 174143 cnt NaN NaN NaN Time
8 1.7 2.020051e+007 cnt NaN NaN NaN DateTime
9 1.8 123 cnt NaN NaN NaN SMT
10 1.9 23.16 C NaN NaN NaN TEMP1
11 1.10 23.55 C NaN 123 NaN TEMP2
12 1.11 22.88 C -23 NaN NaN TEMP3
13 1.12 22.86 C NaN NaN NaN TEMP4
14 1.13 1.406 Meter -1.450 1.500 NaN DIST1
15 1.14 0.718 Meter -0.800 0.350 FAIL DIST2
并且,您可以删除索引0以获得虚线:
df = df.drop(0)
输出:
TEST# RESULT UNITS LOWER UPPER ALARM TEST NAME
0 ------ -------------- -------- -------------- -------------- ----- ----------
1 1.0 1234 NaN NaN NaN NaN TESTNAME1
2 1.1 H647333 NaN NaN NaN NaN TESTNAME2
3 1.2 30 C NaN NaN NaN TEMPTOTAL
4 1.3 1 cnt NaN NaN NaN CEREAL
5 1.4 364003 cnt NaN NaN NaN POINTNUM
6 1.5 20200505 cnt NaN NaN NaN Date
7 1.6 174143 cnt NaN NaN NaN Time
8 1.7 2.020051e+007 cnt NaN NaN NaN DateTime
9 1.8 123 cnt NaN NaN NaN SMT
10 1.9 23.16 C NaN NaN NaN TEMP1
11 1.10 23.55 C NaN 123 NaN TEMP2
12 1.11 22.88 C -23 NaN NaN TEMP3
13 1.12 22.86 C NaN NaN NaN TEMP4
14 1.13 1.406 Meter -1.450 1.500 NaN DIST1
15 1.14 0.718 Meter -0.800 0.350 FAIL DIST2
TEST# RESULT UNITS LOWER UPPER ALARM TEST NAME
1 1.0 1234 NaN NaN NaN NaN TESTNAME1
2 1.1 H647333 NaN NaN NaN NaN TESTNAME2
3 1.2 30 C NaN NaN NaN TEMPTOTAL
4 1.3 1 cnt NaN NaN NaN CEREAL
5 1.4 364003 cnt NaN NaN NaN POINTNUM
6 1.5 20200505 cnt NaN NaN NaN Date
7 1.6 174143 cnt NaN NaN NaN Time
8 1.7 2.020051e+007 cnt NaN NaN NaN DateTime
9 1.8 123 cnt NaN NaN NaN SMT
10 1.9 23.16 C NaN NaN NaN TEMP1
11 1.10 23.55 C NaN 123 NaN TEMP2
12 1.11 22.88 C -23 NaN NaN TEMP3
13 1.12 22.86 C NaN NaN NaN TEMP4
14 1.13 1.406 Meter -1.450 1.500 NaN DIST1
15 1.14 0.718 Meter -0.800 0.350 FAIL DIST2
从标题推断字段宽度的非熊猫解决方案,但使用熊猫从标题推断字段宽度的非熊猫解决方案,但使用熊猫谢谢。这可能会在我的项目的另一部分有用!然而,我的文件不仅仅是上面的格式。它在文件开头的表格上方有一大堆交错的文本。以及多个表,每个表之间都有一块交错的文本。我的代码查找字符串“TEST#RESULT UNITS…”,然后开始逐行解析,直到到达新行(n \表示即将到达下一个表)。然后冲洗并重复。谢谢。这可能会在我的项目的另一部分有用!然而,我的文件不仅仅是上面的格式。它在文件开头的表格上方有一大堆交错的文本。以及多个表,每个表之间都有一块交错的文本。我的代码查找字符串“TEST#RESULT UNITS…”,然后开始逐行解析,直到到达新行(n \表示即将到达下一个表)。然后冲洗并重复。哦,这太完美了,谢谢!哦,这太完美了,谢谢你!