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

Pandas使用to_csv写入IPWhois查询结果时数据错位、重复输出表头问题

问题产生原因

  • 单条结果覆盖所有行:循环遍历IP时,你直接对df['network']/df['cidr']等整列赋值,每轮循环都会把所有行的这几个字段覆盖为当前IP的查询结果,最终所有行都会保留最后一次查询的结果。
  • 重复表头+索引不匹配:你将df.to_csv写在了for循环内部,每处理一个IP就以追加模式(mode='a')写入一次完整的df数据,且每次都开启表头输出(header=True),自然会每次都新增一套表头+全表数据,和原IP索引完全无法对应。另外循环内的with open('csv_data.txt', 'w')完全未被使用,属于冗余代码。

修复方案

核心修改逻辑:

  1. 循环内仅给当前遍历行的对应字段赋值,不要操作整列
  2. 等所有IP全部查询完成后,一次性写入完整DataFrame到CSV文件,不要在循环内追加写入
  3. 可新增异常捕获逻辑,避免单个IP查询失败导致整个程序中断

修改后代码如下:

import pandas as pd
import socket
import time
from ipwhois import IPWhois

def main ():
    df = pd.read_csv('dupfree.csv')
    # 提前初始化新列,避免赋值告警
    df[['network', 'cidr', 'country', 'date']] = None
    whoisyou(df)
    # 全部查询完成后一次性写入
    df.to_csv('output.csv', index=False)

        
def whoisyou(df):
    s = socket.socket()
    s.settimeout(10)
    for index,row in df.iterrows():
        DN = row['ip']
        print(f"正在查询:{DN}")
        try:
            ipwhois = IPWhois(DN).lookup_rdap()
            # 仅给当前行的对应列赋值
            df.loc[index, 'network'] = ipwhois['asn_cidr']
            df.loc[index, 'cidr'] = ipwhois['asn_description']
            df.loc[index, 'country'] = ipwhois['asn_country_code']
            df.loc[index, 'date'] = ipwhois['asn_date']
            print(df.loc[index, 'date'])
        except Exception as e:
            print(f"IP {DN} 查询失败:{str(e)}")
        time.sleep(0.5)

if __name__ == "__main__":
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:06:03