如何用Pandas读取含多IP的CSV并实现反向DNS查询?
解决CSV多IP列的反向DNS查询问题
你的问题核心有两个:一是CSV读取参数设置错误,二是未拆分多IP字段。以下是具体解决方案:
关键问题修正
- quotechar参数错误:你把
quotechar设为了逗号,这完全不对——CSV里quotechar是用来包裹包含分隔符的字段的字符(通常是双引号),改成quotechar='"'才能正确识别带逗号的多IP单元格。 - 未拆分多IP字段:多IP单元格是一串用逗号分隔的IP字符串,必须拆分成单个IP才能让反向查询函数正常工作。
修改后的完整代码
# 安装依赖 # pip install pandas dnspython xlrd xlsxwriter ### 导入库 ### import pandas as pd import time from pandas.io.excel import ExcelWriter from dns import resolver, reversename ### 计时 ### startTime = time.time() # 读取CSV:修正quotechar,保留去引号/括号的转换器 custom_delimiter = ',' logs = pd.read_csv( 'C:\\Users\\user\\Desktop\\rdnslookup\\input_file\\logs.csv', sep=custom_delimiter, quotechar='"', # 改成双引号,正确识别带逗号的字段 engine='python', converters={'ip': lambda x: x.strip('[""]')}, # 去掉首尾的引号和方括号 on_bad_lines="skip" ) # 拆分多IP为单独行:把每个IP列表展开成独立行 # 先把ip列按逗号分割成列表,再用explode拆分 logs['ip'] = logs['ip'].str.split(',') logs_exploded = logs.explode('ip').reset_index(drop=True) # 去除IP前后的空格(如果有的话) logs_exploded['ip'] = logs_exploded['ip'].str.strip() # 去重IP,避免重复查询 logs_filtered = logs_exploded.drop_duplicates(['ip']).copy() ### 反向DNS查询函数 ### def reverseDns(ip): # 简单的IP格式校验(可选,避免无效IP查询报错) if not ip or '.' not in ip: return 'N/A' try: return str(resolver.query(reversename.from_address(ip), 'PTR')[0]) except Exception: return 'N/A' # 执行查询 logs_filtered['dns'] = logs_filtered['ip'].apply(reverseDns) # 合并查询结果到拆分后的全量数据 final_logs = logs_exploded.merge(logs_filtered[['ip', 'dns']], how='left', on='ip') ### 输出到Excel ### writer = ExcelWriter( 'C:\\Users\\user\\Desktop\\rdnslookup\\output_file\\validated_logs.xlsx', engine='xlsxwriter' ) final_logs.to_excel(writer, 'Sheet1', index=False) writer.close() # 打印耗时 print(f"处理完成,耗时: {time.time() - startTime:.2f} 秒")
代码说明
- CSV读取修正:
quotechar='"'让pandas正确识别被双引号包裹的多IP字段,不会把字段内的逗号当成列分隔符。 - 多IP拆分:
str.split(',')把每个单元格的IP字符串拆成列表,explode()把列表展开成单独行,确保每行只有一个IP。 - IP清洗:
str.strip()去除IP前后可能存在的空格,避免查询失败。 - 可选校验:在
reverseDns里加了简单的IP格式判断,跳过无效的空值或非IP字符串。
内容的提问来源于stack exchange,提问作者Sulphuric-16
相关产品推荐
相关产品推荐

