【问题标题】:Python- Skip the line with error and process the next linePython-跳过错误行并处理下一行
【发布时间】:2020-01-19 18:05:25
【问题描述】:

我有以下代码,我正在尝试使用 overpy 对文件进行反向地理编码。在尝试这样做时,我遇到了几个问题

1) 为避免 Overpytoomanyrequests 错误,我正在使用 Try except,每次出现错误时,while 循环都从第一个开始,有没有办法让 while 循环从出现错误的行恢复,而不是从第一个开始线? 2)还有少数数据点的纬度值超过90,我们可以编写代码跳过这些数据不一致的行并处理下一行吗? 我尝试通过,继续,接下来所有这些都以无限循环结束

import overpy
import pandas as pd
import numpy as np
import time
import sys

df = pd.read_csv("/home/runner/sample_v1.csv")
df.sort_values(by=['cvdt35_timestamp_s'],inplace=True)

api= overpy.Overpass()
box = 0.0005
queries = []
names = []
highways =[]
results = []
df['Name']=''
df['Highway'] =''

while True :
  try :
    for row in df.index:                                                                                             
        query = ('way["highway"~"."](around:15,{},{});(._;<;); out body;').format(df.gps_lat_dd.iloc[row], df.gps_lon_dd.iloc[row])
        queries.append(query)

    for i in range(len(queries)):
        query = queries[i]
        print(str(i)+', '+query)
        result = api.query(query)
        results.append(result)

    for result in results:
        n1 = []
        h1 = []
        for way in result.ways:
            name = way.tags.get("name", "n/a")
            n1.append(name)
            highway = way.tags.get("highway", "n/a")
            h1.append(highway)
        names.append(','.join(n1))
        highways.append(','.join(h1))
  except overpy.exception.OverpassTooManyRequests:
      time.sleep(10*6)
  except overpy.exception.OverpassBadRequest:
    next
    break

df['Name']=names
df['Highway']=highways


样本数据


RecordID    GPS_Latitude_Min_dec    gps_lat_dd  gps_lon_dd
947 1.6383  167.077305  333.077305
948 1.6383  167.077305  333.077305
881 0.4332  42.30722    -83.18112667
882 0.4333  42.30722167 -83.18112667
883 0.433   42.30721667 -83.181125
884 0.433   42.30721667 -83.181125

代码应忽略前两行并从第三行继续处理。提前感谢您的帮助

编辑如下


while True :
  try :
      for row in df.index:                                                                                            
          query = ('way["highway"~"."](around:15,{},{});(._;<;); out body;').format(df.gps_lat_dd.iloc[row], df.gps_lon_dd.iloc[row])
          queries.append(query)
      for i in range(len(queries)):
        query = queries[i]
        print(str(i)+', '+query)
        result = api.query(query)
        results.append(result)
  except overpy.exception.OverpassTooManyRequests:
    time.sleep(10*6)
    False
  except overpy.exception.OverpassBadRequest:
    False
    continue

    for result in results:
        n1 = []
        h1 = []
        for way in result.ways:
            name = way.tags.get("name", "n/a")
            n1.append(name)
            highway = way.tags.get("highway", "n/a")
            h1.append(highway)
            names.append(','.join(n1))
            highways.append(','.join(h1))

但仍然是无限循环

【问题讨论】:

  • continue 是继续前进的声明,而不是停止并继续前进的 break。您可能需要将循环计数保持在 try/except 块之外,然后它在遇到异常时不会被重置。现在考虑您的while,没有任何东西可以跟踪它的位置,并且您的 try/except 包含了整个其余代码,这意味着它破坏了整个块而不仅仅是单个部分。
  • 修改代码如下但还是死循环while True : try : for row in df.index: query = ('way["highway"~"."](around:15,{},{});(._;&lt;;); out queries.append(query) except overpy.exception.OverpassTooManyRequests: time.sleep(10*6) except overpy.exception.OverpassBadRequest: continue for i in range(len(queries)):
  • 您需要将其编辑到帖子中以保持间距。
  • 我在问题中更新了
  • 我添加了一个解决方案 @anonymous13 我无法测试它,因为我没有你的数据,但它应该可以工作。

标签: python loops try-catch except


【解决方案1】:

您可以在唯一可以实际遇到异常的地方(您使用 api 查询的地方)捕获您的 try/except 块。

如果您完成了该部分,则退出 while 循环,然后仅附加实际结果。

import overpy
import pandas as pd
import numpy as np
import time
import sys

df = pd.read_csv("/home/runner/sample_v1.csv")
df.sort_values(by=['cvdt35_timestamp_s'],inplace=True)

api= overpy.Overpass()
box = 0.0005
queries = []
names = []
highways =[]
results = []
df['Name']=''
df['Highway'] =''

for row in df.index:                                                                                             
    query = ('way["highway"~"."](around:15,{},{});(._;<;); out body;').format(df.gps_lat_dd.iloc[row], df.gps_lon_dd.iloc[row])
    queries.append(query)

for i in range(len(queries)):
    result = 0
    query = queries[i]
    print(str(i)+', '+query)
    while True:
        try:
            result = api.query(query)
            break
        except overpy.exception.OverpassTooManyRequests:
            time.sleep(10*6)
        except overpy.exception.OverpassBadRequest:
            break
    if result:
        results.append(result)

for result in results:
    n1 = []
    h1 = []
    for way in result.ways:
        name = way.tags.get("name", "n/a")
        n1.append(name)
        highway = way.tags.get("highway", "n/a")
        h1.append(highway)
    names.append(','.join(n1))
    highways.append(','.join(h1))

df['Name']=names
df['Highway']=highways

【讨论】:

  • 谢谢你,这是有效的,但我得到一个值错误,因为数据帧的长度和要附加的数据不同。我的问题中有示例数据
  • 如果你需要保持相同的长度,你有if result:你需要添加一个else: results.append(0)或其他一些占位符。我没有看你的其余代码,我只解决了你发布的问题。
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
相关资源
最近更新 更多