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')完全未被使用,属于冗余代码。
修复方案
核心修改逻辑:
- 循环内仅给当前遍历行的对应字段赋值,不要操作整列
- 等所有IP全部查询完成后,一次性写入完整DataFrame到CSV文件,不要在循环内追加写入
- 可新增异常捕获逻辑,避免单个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
相关产品推荐
相关产品推荐

