【问题标题】:Store multiple print output values from for loop into a list or variable将 for 循环中的多个打印输出值存储到列表或变量中
【发布时间】: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。我是新手,上周才开始,我发现了很多东西,但在我的特殊情况下找不到对我有帮助的答案。也许我错过了 - 抱歉。

感谢任何可以提供帮助和建议的人!

【问题讨论】:

    标签: python pandas list for-loop variables


    【解决方案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 {:&lt;30} 只是字符串格式,意思是将域名左对齐(30 个字符宽)——它只是为了漂亮的打印
    • 啊,我怀疑,现在你确认了,欣赏漂亮的印刷品。现在在研究了您的编辑后,我看到您将每个打印件 output 附加到同一个变量:status_codes,然后使用 zip 并在格式化后创建新的*数据框以使用... - ,非常感谢您的帮助在完成我的任务(:
    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 2021-10-30
    • 2015-12-22
    • 2023-01-28
    • 2015-12-26
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多