从CSV指定行生成字典并合并同键值的Python实现问题
从指定目录CSV文件生成并合并字典的正确实现
需求回顾
- 遍历目标目录下所有
.csv文件 - 每个文件以第一行内容为字典的键,第三行内容为对应键的值
- 将每个文件生成的字典存入列表后,合并所有字典中相同键的值(对同键的值进行累加)
原代码问题分析
df.to_dict()会将整个DataFrame转换为字典,不符合“仅取第一行键、第三行值”的规则,导致结构混乱- 读取CSV时默认加载了空的第二行,生成了不必要的零值
- 变量名错误:
napake_list未定义,实际应该使用slovar_list
方案1:使用原生csv模块(轻量直接)
原生csv模块可以精准控制读取行,避免多余数据的加载:
import os import glob from collections import Counter root = "C:\\Users\\Public\\DiplomskaNaloga\\anomaly_count" total_counter = Counter() for file in glob.glob(os.path.join(root, '*.csv')): with open(file, 'r', encoding='cp1252') as f: reader = csv.reader(f) # 读取第一行作为键 keys = next(reader) # 跳过第二行 next(reader) # 读取第三行作为值(确保第三行存在,避免报错) try: values = next(reader) except StopIteration: print(f"警告:文件{file}不足三行,已跳过") continue # 生成当前文件的字典,过滤空键或空值(可选) current_dict = {k: int(v) for k, v in zip(keys, values) if k and v} # 合并到总Counter中 total_counter.update(current_dict) # 转换为普通字典 final_result = dict(total_counter) print(final_result)
方案2:使用pandas调整读取逻辑
如果偏好使用pandas,需要指定只读取第一行和第三行,并构建目标字典:
import pandas as pd import os import glob from collections import Counter root = "C:\\Users\\Public\\DiplomskaNaloga\\anomaly_count" total_counter = Counter() for file in glob.glob(os.path.join(root, '*.csv')): # 只读取第0行(表头)和第2行(第三行,索引从0开始) df = pd.read_csv(file, encoding='cp1252', skiprows=[1], nrows=1) # 将行转换为字典,键是表头,值是第三行的内容 current_dict = df.iloc[0].to_dict() # 过滤空值和零值,转换为整数(根据需求调整) current_dict = {k: int(v) for k, v in current_dict.items() if pd.notna(v) and v != 0} # 合并到总Counter total_counter.update(current_dict) final_result = dict(total_counter) print(final_result)
关键说明
- 使用
Counter的update方法可以自动累加相同键的值,比手动遍历合并更高效 - 加入了异常处理(方案1)和空值过滤,避免因CSV格式不规范导致的报错
- 两种方案都跳过了第二行,彻底避免了空行带来的零值问题
内容的提问来源于stack exchange,提问作者CH4
相关产品推荐
相关产品推荐

