如何将CSV读取的列表转为字典?及移除字典中的字符
问题
读取CSV文件时,行开头总会附加\ufeff字符,使用以下代码读取后得到列表格式输出:
r = unicodecsv.reader(f, encoding='utf-8-sig')
输出示例:
line: ['nickname', 'name', 'phone', 'address'] line: ['Harry', 'Harry James Potter', 'N/A', '4 Pivet Drive Little Whinging, Surrey'] line: ['Sirius', 'Sirius Black', 'N/A', '12 Grimald Place London'] line: []
需要实现两个需求:
- 将上述行转为以第一行作为键的字典列表;
- 移除字典键中已存在的
\ufeff字符(尝试dictA.pop('\ufeffnickname', None)无效,且字典无法直接使用replace方法)。
解决方案
1. 转为以表头为键的字典列表
先读取表头,再遍历后续行(跳过空行),通过zip将表头与行数据配对生成字典:
import unicodecsv with open('target.csv', 'rb') as f: reader = unicodecsv.reader(f, encoding='utf-8-sig') # 读取第一行作为表头 headers = next(reader) # 生成字典列表,过滤空行 result = [] for row in reader: if row: # 跳过空行 result.append(dict(zip(headers, row))) print(result)
2. 移除字典键中的\ufeff字符
\ufeff是UTF-8 BOM字符,即便指定了utf-8-sig仍可能残留。可以通过两种方式处理:
方式一:生成字典前清洗表头
提前处理表头的每个键,移除BOM字符后再生成字典:
import unicodecsv with open('target.csv', 'rb') as f: reader = unicodecsv.reader(f, encoding='utf-8-sig') headers = next(reader) # 移除每个表头键中的BOM字符 cleaned_headers = [key.strip('\ufeff') for key in headers] result = [] for row in reader: if row: result.append(dict(zip(cleaned_headers, row)))
方式二:清洗已生成的字典
如果已经得到带BOM键的字典,通过遍历键值对生成新字典:
# 假设dictA是带BOM键的目标字典 cleaned_dict = {key.strip('\ufeff'): value for key, value in dictA.items()}
说明:之前
pop('\ufeffnickname')无效,是因为实际键是\ufeff与nickname的拼接,而非完整字符串'\ufeffnickname',直接清洗每个键的BOM字符更可靠。
内容的提问来源于stack exchange,提问作者realtime
相关产品推荐
相关产品推荐

