将 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

【讨论】:

非常感谢!这很奏效,你预计我下一步将要去哪里。我注意到一些我以前从未见过的东西,:30zip 的代码块中 - 这是一个 zip 功能还是它在 python 中意味着什么?我会更深入地研究 zip - 再次感谢您的帮助和指导。真的很感激。 @knowledgealways :&lt;30 只是字符串格式,意思是将域名左对齐(30 个字符宽)——它只是为了漂亮的打印 啊,我怀疑,现在你确认了,欣赏漂亮的印刷品。现在在研究了您的编辑后,我看到您将每个打印件 output 附加到同一个变量:status_codes,然后使用 zip 并在格式化后创建新的*数据框以使用... - ,非常感谢您的帮助在完成我的任务(:

以上是关于将 for 循环中的多个打印输出值存储到列表或变量中的主要内容,如果未能解决你的问题,请参考以下文章

Python for 循环仅将最后一个列表作为值附加

从python中的for循环返回值

在python中的单个列表上使用多个变量(for循环)[重复]

shell 循环

shell 循环

Shell for循环