Kivy Python中如何访问列表内前两位姓名并写入文件,报错如何解决
问题原因梳理
- 你从输入框拿到的
name是逗号分隔的整段字符串,不是自动拆分好的列表,直接把整段字符串append到data_list后,列表里只有1个元素,自然无法通过索引拿到第一个、第二个姓名 - 报错
io.UnsupportedOperation: not writable是因为文件操作逻辑混乱:你以只写的w模式打开文件后,同时初始化了csv_reader,只读模式的reader无法在只写模式的文件句柄上运行,且你多次重复打开同一文件,冗余逻辑也容易引发冲突 - 你调用
writer.writerow(data_list[0])时,如果传入的是字符串,writerow会把字符串拆成单个字符逐格写入,属于常见的使用误区
实现方法
Kivy环境下的列表操作和原生Python完全一致,没有特殊限制,按以下步骤修正即可:
- 先把输入的姓名字符串按逗号拆分,同时清除每个姓名前后的多余空格
- 避免重复打开文件,按需选择普通txt写入或csv格式写入
- 拆分后的列表直接用
[0]取第一个姓名,[1]取第二个姓名即可
修正后可运行代码
import csv def pressed(self, instance): # 从输入框取原始字符串 name_str = self.name.text # 按逗号拆分,清洗空格、过滤空值,得到正式的姓名列表 name_list = [n.strip() for n in name_str.split(',') if n.strip()] # 避免索引越界,先判断输入的姓名数量是否足够 if len(name_list) < 2: print("输入的姓名不足2个") return # 直接通过索引取对应姓名 first_name = name_list[0] second_name = name_list[1] # 写csv格式文件示例 with open("print.txt", "w", encoding="UTF-8", newline="") as data_file: writer = csv.writer(data_file) # 注意传入列表,避免字符串被拆分为单个字符 writer.writerow([first_name, second_name]) # 不需要csv格式时可以直接写普通txt,替换上面的代码即可 # with open("print.txt", "w", encoding="UTF-8") as f: # f.write(f"第一个姓名:{first_name}\n第二个姓名:{second_name}")
内容的提问来源于stack exchange,提问作者NotTadej
相关产品推荐
相关产品推荐

