使用 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/']
我正在尝试遍历 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”类型(保留请记住,有时可能会有跑卫或其他位置有传球数据,但我们会忽略这一点)。如果它 returnsTrue
,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/']