将 for 循环中的多个打印输出值存储到列表或变量中
Posted
技术标签:
【中文标题】将 for 循环中的多个打印输出值存储到列表或变量中【英文标题】:Store multiple print output values from for loop into a list or variable 【发布时间】:2021-08-13 01:04:19 【问题描述】:我对 python 和 pandas 有几天的了解,但我遇到了一个我似乎无法自己解决的情况。我有一个 for 循环来获取状态代码并在它们满足某些条件时打印出结果。我的for循环如下:
for循环:
import requests
from requests.exceptions import HTTPError
response_full_result = []
for url in url_list:
try:
response = requests.get(url)
response_full_result.append(response)
# If the response was successful, no Exception will be raised
response.raise_for_status()
except HTTPError as http_err:
failed_result.append(http_err)
print(f'HTTP error occurred: http_err')
except Exception as err:
print(f'Other error occurred: err')
else:
print('Success!')
这个 for 循环的作用是,它遍历 .csv 上的列并执行 get 调用以获取状态代码。现在,这还可以打印出按照执行顺序指定的异常。对于示例,如果列的前三行是:200,400,NaN -,则结果将是:成功、HTTP 错误和其他错误(分别)
期望的结果:我理解它按预期打印 - 我希望 所有 将输出存储在我可以的变量/列表中以后一起工作。即success, HTTP error, Other Error
- 有没有办法做到这一点?我尝试了append
方法,pickle
意味着我将不得不转换为不理想的字典。有没有办法在 Python 或 Pandas 中做到这一点?
另外,感谢this doc for providing for loop - 它不是我的。我在 Python 3.9 上使用 PyCharm。我是新手,上周才开始,我发现了很多东西,但在我的特殊情况下找不到对我有帮助的答案。也许我错过了 - 抱歉。
感谢任何可以提供帮助和建议的人!
【问题讨论】:
【参考方案1】:您可以创建一个新列表,例如status_codes
,并在每次迭代后将状态附加到它。然后您可以使用zip()
将 URL 和状态代码绑定在一起或创建新的数据框。例如:
import requests
from requests.exceptions import HTTPError
response_full_result = []
url_list = [
"https://www.google.com",
"https://www.yahoo.com",
"https://xxx.domain.example",
]
status_codes = [] # <-- here we store status codes
for url in url_list:
try:
response = requests.get(url)
response_full_result.append(response)
# If the response was successful, no Exception will be raised
response.raise_for_status()
except HTTPError as http_err:
failed_result.append(http_err)
print(f"HTTP error occurred: http_err")
status_codes.append("HTTP error")
except Exception as err:
print(f"Other error occurred: err")
status_codes.append("Other error")
else:
print("Success!")
status_codes.append("success")
print()
# print the results - use `zip()`
for url, status in zip(url_list, status_codes):
print(":<30 ".format(url, status))
print()
# create a dataframe and write it to csv:
df = pd.DataFrame("URL": url_list, "Status": status_codes)
print(df)
df.to_csv("data.csv", index=False)
打印:
Success!
Success!
Other error occurred: HTTPSConnectionPool(host='xxx.domain.example', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f1e1c5e4100>: Failed to establish a new connection: [Errno -2] Name or service not known'))
https://www.google.com success
https://www.yahoo.com success
https://xxx.domain.example Other error
URL Status
0 https://www.google.com success
1 https://www.yahoo.com success
2 https://xxx.domain.example Other error
并创建data.csv
:
URL,Status
https://www.google.com,success
https://www.yahoo.com,success
https://xxx.domain.example,Other error
【讨论】:
非常感谢!这很奏效,你预计我下一步将要去哪里。我注意到一些我以前从未见过的东西,:30
在 zip
的代码块中 - 这是一个 zip 功能还是它在 python 中意味着什么?我会更深入地研究 zip - 再次感谢您的帮助和指导。真的很感激。
@knowledgealways :<30
只是字符串格式,意思是将域名左对齐(30 个字符宽)——它只是为了漂亮的打印
啊,我怀疑,现在你确认了,欣赏漂亮的印刷品。现在在研究了您的编辑后,我看到您将每个打印件 output
附加到同一个变量:status_codes
,然后使用 zip
并在格式化后创建新的*数据框以使用... - ,非常感谢您的帮助在完成我的任务(:以上是关于将 for 循环中的多个打印输出值存储到列表或变量中的主要内容,如果未能解决你的问题,请参考以下文章