Python无Pandas环境读取CSV指定列去重并过滤无效值方法
无Pandas依赖的高效实现方案
直接用Python标准库自带的csv模块处理就行,不需要额外安装依赖,比手动读行split的鲁棒性高很多,还能一次性解决你遇到的换行、重复读文件、值过滤的问题。
核心优化逻辑:
- 仅打开读取一次文件,避免重复IO开销
- 用csv模块自动处理行尾换行、字段转义等CSV格式细节,不会出现手动split漏处理
\n的问题 - 边读取边过滤无效值、边做去重,不需要先存全量列表再二次处理,内存占用更低
- 无效值用集合存储,判断过滤的时间复杂度是O(1)
完整实现代码:
import csv # 存储最终去重结果 result = set() # 定义需要剔除的无效值 invalid_vals = {"none", "record", ""} with open("machines.csv", "r", newline="", encoding="utf-8") as f: csv_reader = csv.reader(f) # 跳过表头行,如果你的文件没有表头就删除下面这行 next(csv_reader, None) for row in csv_reader: # 取第4列Node、第5列Resolve,strip去掉首尾空白/换行符 node = row[3].strip() resolve = row[4].strip() # 仅将非无效值加入集合,自动去重 if node not in invalid_vals: result.add(node) if resolve not in invalid_vals: result.add(resolve) # 如果需要列表格式结果,直接转list(result)即可
原代码的问题对应修复说明
- 末尾带
\n的问题:csv模块读取时会自动解析行边界,配合.strip()可以彻底清除字段首尾的换行、多余空格、制表符等冗余字符 - 剔除指定值的问题:在值加入结果集之前直接做成员判断,不符合要求的值直接跳过,不需要等全量数据收集完再遍历过滤
- 效率问题:原代码两次打开文件读取全量内容,文件越大重复IO的开销越高,优化后仅需一次遍历即可完成所有处理,性能提升明显
补充说明:如果你的文件里无效值存在大小写混写情况(比如"None"、"NONE"、"Record"),可以把判断逻辑改成if node.strip().lower() not in invalid_vals,同时保证invalid_vals里存的全是小写的无效字符串,就能匹配所有大小写形式的无效值。
内容的提问来源于stack exchange,提问作者Demo
相关产品推荐
相关产品推荐

