Python批量读取CSV调用whois查域名信息时循环无法正常结束
问题原因
- 存在无意义的死循环:你在外层套了
while cont无限循环,当CSV文件的所有行都被遍历完成后,内层的for row in CSVfileReader不会再执行任何操作,程序会空转这个while循环,没有异常触发就永远不会走到cont = False的逻辑,因此卡在第一个文件处理完的位置。 - 异常捕获范围不合理:当前try块包裹了整个循环逻辑,只有当whois查询、文件读写出现报错时才会进入except分支,文件正常读取完成不会触发任何异常,自然不会打印"done with csv"。
- 额外隐患:路径拼接直接用字符串相加容易出错,且
whois.creation_date可能返回单个datetime对象而非列表,直接遍历会触发报错;输出文件未使用上下文管理器管理,容易出现资源泄漏。
修正后代码
import whois import csv import os import time location = "directory" new = 'filename_new' for filename in os.listdir(location): if not filename.endswith(".csv"): continue # 正确拼接路径,避免拼写错误 input_path = os.path.join(location, filename) output_path = os.path.join(location, f"{new}{filename}") count = 1 with open(input_path, "r", encoding="utf-8") as in_f, open(output_path, "a", encoding="utf-8", newline="") as out_f: reader = csv.reader(in_f, delimiter=",") writer = csv.writer(out_f) for row in reader: key = row[0].rstrip() if not key: continue try: # 拉取域名whois信息 domain_info = whois.whois(key) create_date = domain_info.creation_date # 统一转为列表处理,兼容单值、多值两种返回格式 if not isinstance(create_date, list): create_date = [create_date] for dt in create_date: print(dt) writer.writerow([count, key, dt]) print(f"count: {count}") count += 1 time.sleep(0.9) except Exception as e: # 单个域名查询失败仅打印提示,不中断整个处理流程 print(f"域名{key}查询失败,错误信息:{str(e)}") continue # 单个文件处理完成提示 print(f"done with csv: {filename}") print("The End")
改动说明
- 删除冗余的
while cont死循环逻辑,CSV行遍历完成后自动进入下一个文件处理流程 - 缩小异常捕获范围到单个域名的whois查询环节,单个域名查询失败不会中断整个任务,同时文件正常处理完成后会自动打印完成提示
- 用
os.path.join拼接路径,避免路径拼写错误 - 兼容
creation_date单值和多值两种返回格式,避免遍历报错 - 输入输出文件都用
with上下文管理器管理,不需要手动调用close方法,避免资源泄漏 - 新增空行过滤逻辑,避免CSV内空行导致报错
内容的提问来源于stack exchange,提问作者MellyJ13
相关产品推荐
相关产品推荐

