我以前发布了一些有关索引超出范围错误的代码;但是,在解决该错误之后,我意识到获取必要信息的过程中存在缺陷。

我在Python中编写了一个for循环,以在数据文件中搜索标识符匹配且对另一个参数进行了重大更改的实例。发生该实例时,相关数据将输出到文本文件。我忽略了意识到自己想忽略以下任何相同条件的事件。我只想记录第一次出现的情况,然后继续浏览文件,直到出现具有不同标识符的情况,然后继续执行该过程,直到文件结束。

输入数据如下所示:


  0000 0.0000000000 185263.9890 105232.4887 0.0000000000 345.0928095 0.2982502454
  
  0001 0.0000000000 185163.8872 105235.6420 0.0000000000 344.4662790 0.5691114931
  
  0001 218.1599792 185187.4241 105332.8326 100.0000000 30.21264632 0.4583792149
  
  0001 2070.891273 185259.6501 105401.9948 200.0000000 342.4030385 0.05397436763
  
  0002 0.0000000000 185073.8381 105257.5082 0.0000000000 289.0103714 0.1765702856
  
  0002 548.7104537 185007.5650 105182.6224 100.0000000 283.1207050 0.1822454800
  
  0002 4339.891390 184907.6061 105179.7550 200.0000000 235.0171868 0.02637700539
  
  0003 0.0000000000 185044.6468 105355.0609 0.0000000000 141.5931561 0.5491341407
  
  0004 0.0000000000 185037.7703 105455.3306 0.0000000000 148.8916916 0.9710776916
  
  0004 140.8620875 185106.3138 105382.5172 100.0000000 122.1786717 0.7099142273
  
  0004 602.2794100 185206.2952 105384.4448 200.0000000 96.31412264 0.2167235496
  
  0004 2841.576352 185251.6140 105424.2290 260.3040892 139.3786179 0.02692992078
  
  0005 0.0000000000 185879.1193 105481.7119 0.0000000000 240.1629722 0.1176913655
  
  0005 155.2441594 185779.6779 105492.2674 100.0000000 289.7377882 0.6441466166
  
  0005 305.7366429 185688.7618 105533.9118 200.0000000 296.1130146 0.6644850139
  
  0005 632.1957592 185600.2198 105580.3909 300.0000000 298.9600016 0.3063170700
  
  0005 889.3161045 185516.5649 105549.4496 389.1936581 32.05095338 0.3468945953
  
  0005 1114.532354 185538.1521 105576.9088 424.1223441 8.425251603 0.1550895465
  
  0005 1282.115239 185545.3480 105477.1680 524.1223441 3.718447942 0.5967196476


每行的第一项是标识符。每行的第三和第四项是坐标点。每行的第六项是方向角值(这是感兴趣的参数)。目标是找到两条具有相同标识符的线,并比较方向角值是否有重大变化(在这种情况下,大于90度),然后记录标识符和坐标点。例如:


  0001 0.0000000000 185163.8872 105235.6420 0.0000000000 344.4662790 0.5691114931
  
  0001 218.1599792 185187.4241 105332.8326 100.0000000 30.21264632 0.4583792149


在这两行中,标识符0001匹配,方向角变化超过90度。该条件由for循环中的if语句标记,并且标识符和坐标点输出到文本文件。我有那个工作的过程。但...


  0001 0.0000000000 185163.8872 105235.6420 0.0000000000 344.4662790 0.5691114931
  
  0001 218.1599792 185187.4241 105332.8326 100.0000000 30.21264632 0.4583792149
  
  0001 2070.891273 185259.6501 105401.9948 200.0000000 342.4030385 0.05397436763


序列中的第三行也与标识符匹配,并且方向角变化大于90度,因此它也被条件语句标记并记录到输出文件中。我想忽略条件的任何重复实例,只记录第一次出现的情况。

另外,当比较的两行没有匹配的标识符时,我想标记并记录坐标数据,尽管我认为我可以将它作为if / else与其他条件组合的一部分来处理。更重要的是,对于已经标记并记录的标识符,能够忽略大于90度的方向角变化的任何重复出现。由于大多数人都不熟悉Python(以及一般而言的编程),因此我似乎找不到这种情况的现有解决方案。我不一定要寻找复杂的解决方案。我只需要捕获一组特定的数据即可在ArcGIS项目中重复使用。

谢谢您的建议。

line1 = trackdata.readline()
line2 = trackdata.readline()

for i in range(l-1):

    file_no1 = line1.split()[0]
    time1 = line1.split()[1]
    x1 = line1.split()[2]
    y1 = line1.split()[3]
    length1 = line1.split()[4]
    flow_dir1 = float(line1.split()[5])
    flow_mag1 = line1.split()[6]

    file_no2 = line2.split()[0]
    time2 = line2.split()[1]
    x2 = line2.split()[2]
    y2 = line2.split()[3]
    length2 = line2.split()[4]
    flow_dir2 = float(line2.split()[5])
    flow_mag2 = line2.split()[6]

    if file_no1 == file_no2:
        if abs(flow_dir2 - flow_dir1) > 90.0:
            print >> coordinates1, file_no1, x1, y1

    line1 = line2
    line2 = trackdata.readline()

最佳答案

您可以尝试这样的事情;

if file_no1 == file_no2:
    if abs(flow_dir2 - flow_dir1) > 90.0:
        print >> coordinates1, file_no1, x1, y1
        tempLine = trackdata.readline() # grabs next line
        temp_no = tempLine.split()[0] # grabs file id
        while temp_no == file_no1: # runs while its the same as the file
                                   #  id that gave us the condition
            tempLine = trackdata.readline()
            temp_no = tempLine.split()[0]
        line1 = tempLine                # set new lines
        line2 = trackdata.readline()

if file_no1 = line1.split()[0]:
    line1 = line2
    line2 = trackdata.readline()


这里要检查的是确保您不要尝试读取文件末尾的内容,因此您将需要为此添加检查

09-19 23:05