使用 Try Except 遍历 Python 中的列表

Using Try Except to iterate through a list in Python

我正在尝试遍历 NFL QB 列表(超过 100 个)并添加创建一个 link 列表,我稍后会用到。

link遵循标准格式,但是如果有多个玩家同名(例如'Josh Allen'),link格式需要改变。

我一直在尝试使用 Try/Except 的不同嵌套 while/for 循环来执行此操作,但几乎没有成功。这是我目前所拥有的:

test = ['Josh Allen', 'Lamar Jackson', 'Derek Carr']

empty_list=[]

name_int = 0

for names in test:
    try:
        q_b_name = names.split()
        link1=q_b_name[1][0].capitalize()
        link2=q_b_name[1][0:4].capitalize()+q_b_name[0][0:2].capitalize()+f'0{name_int}'
        q_b = pd.read_html(f'https://www.pro-football-reference.com/players/{link1}/{link2}/gamelog/')
        q_b1 = q_b[0]

        #filter_status is a function that only works with QB data
        df = filter_stats(q_b1)
        #triggers the try if the link wasn't a QB
        df.head(5)

        empty_list.append(f'https://www.pro-football-reference.com/players/{link1}/{link2}/gamelog/')



    except:
        #adds one to the variable to change the link to find the proper QB link
        name_int += 1

结果只追加了最后正确的link。我需要将每个正确的 link 附加到空列表中。

仍然是 Python 的初学者,正在尝试通过不同的项目挑战自己。谢谢!

如前所述,try/except 会工作,因为它会尝试 try 块下的代码。如果在该块内的任何一点它失败或引发 exception/error,它将继续执行 except.

下的代码块

有更好的方法来解决这个问题(例如,我会使用 BeautifulSoup 来简单地检查 html 的“QB”位置),但由于您是初学者,我认为尝试学习这个过程将有助于您理解循环。

那么这段代码做了什么:

  • 1 它将您的玩家名称格式化为 link 格式。
  • 2 我们初始化一个 while 循环,它将进入
  • 3 它得到 table.
  • 4a) 它进入一个检查 table 是否包含 'passing' 的函数 通过查看 headers.
  • 列的统计数据
  • 4b) 如果它在列中找到 'passing',它将 return 一个 True 语句表明它是 table 的“QB”类型(保留请记住,有时可能会有跑卫或其他位置有传球数据,但我们会忽略这一点)。如果它 returns True,while 循环将停止并转到 test 列表中的下一个名称
  • 4c) 如果它 returns False,它会增加你的 name_int 并检查下一个
  • 5 为了处理永远找不到 QB 的情况 table,while 循环将在尝试 10 次迭代后变为 False

代码:

import pandas as pd

def check_stats(q_b1):
    for col in q_b1.columns:
        if 'passing' in col.lower():
            return True
    return False
    
test = ['Josh Allen', 'Lamar Jackson', 'Derek Carr']

empty_list=[]
for names in test:
    name_int = 0
    q_b_name = names.split()
    link1=q_b_name[1][0].capitalize()
        
    qbStatsInTable = False
    while qbStatsInTable == False:
        link2=q_b_name[1][0:4].capitalize()+q_b_name[0][0:2].capitalize()+f'0{name_int}'
        url = f'https://www.pro-football-reference.com/players/{link1}/{link2}/gamelog/'
        
        try:
            q_b = pd.read_html(url, header=0)
            q_b1 = q_b[0]
        except Exception as e:
            print(e)
            break
            
        
        #Check if "passing" in the table columns
        qbStatsInTable = check_stats(q_b1)
            
        if qbStatsInTable == True:
            print(f'{names} - Found QB Stats in {link1}/{link2}/gamelog/')
            empty_list.append(f'https://www.pro-football-reference.com/players/{link1}/{link2}/gamelog/')
        else:
            name_int += 1
            
        if name_int == 10:
            print(f'Did not find a link for {names}')
            qbStatsInTable = False

输出:

print(empty_list)
['https://www.pro-football-reference.com/players/A/AlleJo02/gamelog/', 'https://www.pro-football-reference.com/players/J/JackLa00/gamelog/', 'https://www.pro-football-reference.com/players/C/CarrDe02/gamelog/']