You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本仅写入最后一条URL检测结果,如何输出全部内容?

解决URL检测结果仅保留最后一条的问题

你的问题根源很明确:每次处理一个URL时,你都用写入模式("w")打开output.csv,这个模式会清空文件里的所有已有内容,然后写入当前行,所以最终文件里只会剩下最后一次循环的结果。

另外还有个隐藏的小问题:原代码里的s = 'Quantity' or 'Stock'逻辑不对,Python里or运算符会返回第一个为真的表达式,所以s实际只会是'Quantity',永远不会检查'Stock',这个也得一起修正。

下面是修改后的完整脚本,同时优化了CSV格式(把URL和库存状态分成独立列),还增加了异常处理避免脚本崩溃:

import re
import requests
import csv

# 同时打开输入和输出文件,用csv模块处理更规范
with open("input.csv") as input_file, open("output.csv", "w", newline="") as output_file:
    csv_reader = csv.reader(input_file)
    csv_writer = csv.writer(output_file)
    
    # 可选:写入表头,让输出CSV更易读
    csv_writer.writerow(["URL", "Stock Status"])
    
    for row in csv_reader:
        url = row[0]
        print(f"正在检测: {url}")
        try:
            # 发送请求,同时捕获请求错误
            response = requests.get(url)
            response.raise_for_status()  # 触发HTTP错误(比如404、500)
            
            # 同时检查"Quantity"和"Stock"关键词
            if re.search(r'Quantity|Stock', response.text):
                stock_status = "In Stock"
            else:
                stock_status = "OUT OF STOCK"
            
            print(f"检测结果: {stock_status}")
            # 写入一行:URL + 库存状态
            csv_writer.writerow([url, stock_status])
            
        except requests.exceptions.RequestException as e:
            # 处理网络错误、无效URL等异常情况
            error_msg = f"检测失败: {str(e)}"
            print(f"{url} {error_msg}")
            csv_writer.writerow([url, error_msg])

关键修改点说明:

  1. 调整文件打开时机:把output.csv的打开操作移到循环外面,整个脚本只打开一次文件,用写入模式("w")初始化文件,后续通过csv_writer追加内容,不会覆盖之前的结果。
  2. 使用csv.writer规范输出:替代原脚本直接拼接字符串写入的方式,输出的CSV是标准的多列格式,用Excel或其他工具打开时,URL和状态会自动分成两个单元格。
  3. 修复正则匹配逻辑:用r'Quantity|Stock'同时匹配两个关键词,解决原代码只检查"Quantity"的问题。
  4. 增加异常处理:捕获请求过程中的网络错误、HTTP错误等,避免脚本中途崩溃,同时把错误状态写入输出文件。

如果你坚持要保持原脚本里的“URL+状态拼接成一个字符串”的格式,也可以把输出文件改成追加模式("a"),但这种方式不如标准CSV格式实用,示例如下:

import re
import requests
import csv

with open("input.csv") as f:
    # 先清空输出文件(可选,避免多次运行时追加旧内容)
    with open("output.csv", "w") as output_f:
        pass
    # 用追加模式写入每一条结果
    for row in csv.reader(f):
        url = row[0]
        r = requests.get(url)
        # 修复正则匹配逻辑
        if re.search(r'Quantity|Stock', r.text):
            inis = "In Stock"
        else:
            inis = "OUT OF STOCK"
        result_line = f"{url} {inis}"
        print(result_line)
        with open("output.csv", "a") as output_f:
            output_f.write(result_line + "\n")

不过还是更推荐第一种用csv.writer的方案,格式更规范,后续处理更方便。

内容的提问来源于stack exchange,提问作者t0m3k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:13:15