如何根据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 \表示即将到达下一个表)。然后冲洗并重复。哦,这太完美了,谢谢!哦,这太完美了,谢谢你!