Python CSV读取问题:如何将读取到的字符串转为列表并访问元素
CSV读写嵌套列表的类型转换解决方案
问题根源
CSV是纯文本格式,csv.writer写入嵌套列表时,会把列表直接转成字符串形式(比如['a','b']变成"['a', 'b']"),读取后自然是字符串类型,没法直接按列表索引访问元素。
两种可行解决办法
办法1:用ast.literal_eval解析字符串
ast.literal_eval能安全把字符串形式的Python字面量(列表、字典这类)转回原对象,比eval安全,不会执行恶意代码。
修改后的完整代码:
import csv import ast # 写入数据 data = [['a', 'b'], 'c', 'd'] with open('a.csv', 'a', newline='', encoding='utf-8') as file: writer = csv.writer(file, delimiter=';') writer.writerow(data) # 读取并转换类型 with open('a.csv', 'r', newline='', encoding='utf-8') as file: for row in csv.reader(file, delimiter=';'): # 将字符串转成列表 nested_list = ast.literal_eval(row[0]) print(type(nested_list)) # 输出 <class 'list'> print(nested_list[0]) # 输出 'a'
办法2:JSON序列化/反序列化
把嵌套列表转成JSON字符串写入,读取时再解析成列表,这种方式对复杂嵌套结构兼容性更好,尤其是包含特殊字符的情况。
代码示例:
import csv import json # 写入数据 data = [['a', 'b'], 'c', 'd'] # 把嵌套列表转成JSON字符串 data[0] = json.dumps(data[0]) with open('a.csv', 'a', newline='', encoding='utf-8') as file: writer = csv.writer(file, delimiter=';') writer.writerow(data) # 读取并转换 with open('a.csv', 'r', newline='', encoding='utf-8') as file: for row in csv.reader(file, delimiter=';'): # 解析JSON字符串为列表 nested_list = json.loads(row[0]) print(type(nested_list)) # 输出 <class 'list'> print(nested_list[0]) # 输出 'a'
注意点
- 优先用
ast.literal_eval或JSON方法,别用eval()——如果CSV文件被篡改,eval()可能执行恶意代码,风险高。 - 嵌套结构含特殊字符时,JSON方法更稳妥,因为JSON的字符串格式是标准的。
内容的提问来源于stack exchange,提问作者Mhd
相关产品推荐
相关产品推荐

