Python如何在CSV单列存储多变量并读取为列表
读取CSV多值列并转换为列表的实现方案
问题背景
使用Python开发节点连接地图功能,需读取包含Name、Previous(前驱节点)、Next(后继节点)三列的CSV文件,将列内存储的多值解析为列表结构。支持pandas方案和纯Python无依赖方案,可调整CSV存储格式或读取逻辑。
示例CSV对应期望输出:
alpha, ['one', 'two'], ['three'] beta, ['four'], ['five'] charlie, ['six'], ['seven', 'eight']
原有代码的核心问题是:read_csv读取到的多值列是完整字符串,未做拆分操作,因此只能得到单元素列表。
方案1:沿用空格分隔多值的CSV格式
如果所有节点名本身不包含空格,不需要修改原有CSV,读取后按空格拆分即可。
CSV格式示例:
Name,Previous,Next Alpha,one two,Three Beta,four,five Charlie,six,seven eight
pandas实现代码
import pandas as pd df = pd.read_csv("connections.csv") # 按空格拆分多值列为列表 df["Previous"] = df["Previous"].str.split() df["Next"] = df["Next"].str.split() # 按期望格式输出 for _, row in df.iterrows(): print(f"{row['Name'].lower()}, {row['Previous']}, {row['Next']}")
纯Python实现(无pandas依赖)
import csv res = [] with open("connections.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: prev = row["Previous"].split() next_n = row["Next"].split() res.append((row["Name"].lower(), prev, next_n)) # 打印结果 for item in res: print(f"{item[0]}, {item[1]}, {item[2]}")
方案2:使用标准CSV双引号包裹多值格式(推荐)
如果节点名可能包含空格、特殊字符,优先使用该格式,兼容性更强,不会出现分隔符冲突。
CSV格式示例(多值用双引号包裹,内部用逗号分隔):
Name,Previous,Next Alpha,"one,two",Three Beta,four,five Charlie,six,"seven,eight"
pandas实现代码
read_csv默认自动识别引号包裹的字段,读取后按逗号拆分即可:
import pandas as pd df = pd.read_csv("connections.csv") # 按逗号拆分多值列为列表,加strip()去除元素前后多余空格 df["Previous"] = df["Previous"].apply(lambda x: [i.strip() for i in x.split(",")]) df["Next"] = df["Next"].apply(lambda x: [i.strip() for i in x.split(",")])
纯Python实现(无pandas依赖)
Python内置csv模块默认支持解析引号包裹的字段:
import csv res = [] with open("connections.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: prev = [i.strip() for i in row["Previous"].split(",")] next_n = [i.strip() for i in row["Next"].split(",")] res.append((row["Name"].lower(), prev, next_n))
注意事项
- 代码中的列名需要和CSV表头的大小写完全一致,否则会触发KeyError
- 空格分隔方案仅适用于节点名本身不含空格的场景,否则会出现错误拆分
- 若CSV内容存在多余空格,拆分时建议对每个元素做
strip()处理,避免列表元素带无意义的空白字符 - 双引号+逗号分隔是CSV的标准多值存储格式,兼容所有CSV解析工具,优先选择该格式存储多值数据
内容的提问来源于stack exchange,提问作者MiniDesh
相关产品推荐
相关产品推荐

