二维字符串列表写入文本文件后读取索引异常问题
解决二维列表写入文件后读取索引错位的问题
我来帮你搞定这个问题!你遇到的data[0][0]取不到str1反而data[0][1]能拿到的情况,核心原因是写入时直接把子列表转成带格式的字符串,读取后又没正确把字符串还原回列表结构,导致读取后的“列表”其实是字符串的拆分结果,自然索引对应不上。
问题根源拆解
当你执行f.write(str(sublist))时,写入文件的内容是类似['str1', 'str2', 'str3']的字符串——它带了方括号、单引号这些语法符号。如果读取后只是简单用readlines()拿字符串,再直接把字符串当列表处理(比如list(line)或者随便按逗号分割),得到的元素会是[、'这类符号,而不是你想要的str1、str2。
三种正确的解决方案
方案1:用eval解析字符串(简单但注意安全)
如果能完全信任文件内容(不会被恶意篡改),可以直接把读取到的字符串解析回列表:
写入代码:
a = [['str1','str2','str3'],['str4','str5','str6'],['str7','str8','str9']] file_path = r'D:\Trails\test.txt' # 循环写入每个子列表的字符串形式 with open(file_path, 'w', encoding='utf-8') as f: for sublist in a: f.write(f"{sublist}\n")
读取代码:
with open(file_path, 'r', encoding='utf-8') as f: lines = f.readlines() # 把每行的字符串解析成列表 data = [eval(line.strip()) for line in lines] # 测试索引 print(data[0][0]) # 输出 'str1',和原a[0][0]一致
方案2:用CSV格式(规范且安全,推荐)
CSV是专门存储表格数据的格式,非常适合二维列表的读写:
写入代码:
import csv a = [['str1','str2','str3'],['str4','str5','str6'],['str7','str8','str9']] file_path = r'D:\Trails\test.txt' with open(file_path, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerows(a) # 一次性写入整个二维列表
读取代码:
import csv with open(file_path, 'r', newline='', encoding='utf-8') as f: reader = csv.reader(f) data = list(reader) print(data[0][0]) # 输出 'str1',完全符合预期
方案3:用JSON格式(适合复杂数据结构)
如果以后你的列表可能包含数字、嵌套结构等复杂数据,JSON是更通用的选择:
写入代码:
import json a = [['str1','str2','str3'],['str4','str5','str6'],['str7','str8','str9']] file_path = r'D:\Trails\test.txt' with open(file_path, 'w', encoding='utf-8') as f: json.dump(a, f) # 直接序列化整个列表到文件
读取代码:
import json with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) print(data[0][0]) # 输出 'str1',和原列表结构完全一致
总结
不管用哪种方法,核心都是保证写入的内容能被正确还原为原列表结构,而不是把字符串拆成零散的字符或片段。用CSV或JSON会比eval更安全、规范,推荐优先使用。
内容的提问来源于stack exchange,提问作者Raady
相关产品推荐
相关产品推荐

