Python解析CSV遇两问题:列表被识别为字符串及代码优化
解决CSV解析的两个问题:字符串列表转义与代码优化
问题1:将CSV中的字符串列表转为实际列表
你的CSV里Address字段是['192.168.x.10', '127.0.0.1']这类格式的字符串,没法直接当作Python列表操作。手动用strip+replace的方式容错性差(比如遇到空格、引号格式变化时容易出错),推荐用ast.literal_eval()安全解析——它能把符合Python语法的字符串直接转换成对应的数据结构(列表、字典等)。
问题2:简化代码逻辑
原始代码存在几处错误和冗余:
- 变量名不一致:
open('myFile')赋值给file,但csv.DictReader用了未定义的csv_file row[host]应为row['Name'](CSV列名是Name)split缺少括号,正确写法是split(', ')
优化后的代码用next()函数直接提取目标地址,避免嵌套循环,同时修复上述问题:
优化后代码
import csv import ast with open('myFile') as csv_file: csv_reader = csv.DictReader(csv_file, delimiter=',') for row in csv_reader: # 把字符串格式的列表转为实际Python列表 addresses = ast.literal_eval(row['Address'].strip()) # 直接获取第一个包含192.168的地址 target_addr = next(addr for addr in addresses if '192.168' in addr) print(row['Name'], target_addr)
代码说明
ast.literal_eval(row['Address'].strip()):先去除字符串前后冗余空格,再解析为列表,比手动处理更稳定可靠next(addr for addr in addresses if '192.168' in addr):用生成器表达式配合next(),直接定位第一个符合条件的地址,无需循环遍历后break- 修正了原始代码的变量错误,逻辑更简洁清晰
输出结果
host1 192.168.x.10 host2 192.168.x.12 host3 192.168.x.14
内容的提问来源于stack exchange,提问作者N. J
相关产品推荐
相关产品推荐

