Python add函数中两个for循环无运行无输出问题求助
问题分析与解决方案
循环无输出的核心原因
你定义的f4是csv.reader对象,它属于一次性迭代器——第一个for i in f4循环已经把文件里的所有内容遍历完,文件指针移到了文件末尾,第二个for i in f4循环再去读取时,已经没有剩余数据可以遍历,所以完全没输出。
代码里的其他问题
- 直接用
open('books.csv', 'r')打开文件却没有手动关闭,容易造成资源泄漏,应该用with语句自动管理文件生命周期 - 第一个循环里递归调用
add(n,m,o)会导致逻辑混乱,比如重复检查、重复写入数据,甚至可能触发递归深度限制
修正后的代码
import csv def add(n, m, o): # 先检查图书编号是否存在 exists = False with open('books.csv', 'r') as f: f4 = csv.reader(f) for i in f4: if not i: # 简化空行判断 continue if i[0] == n: print('Book Code already exists') exists = True break if exists: # 这里改成循环重试,避免递归引发的问题 add(n, m, o) return # 编号不存在,写入数据 l = [n, m, o] with open('books.csv', 'a') as f2: f3 = csv.writer(f2) f3.writerow(l) # 直接用已有的列表输出内容,无需再次读取文件 print('Name:', l[1], 'Author:', l[2], 'BookID:', l[0]) y = input('Do you wish to change any information entered before? [Y/N]') if y.lower() == 'y': edit()
关键改动说明
- 把文件读取和写入操作拆分成两个独立的
with语句,彻底避免文件指针冲突的问题 - 用
exists标记替代递归逻辑,检查编号重复的逻辑更清晰,也不会出现重复写入的问题 - 写入完成后直接使用已构建的列表
l输出内容,不需要再次读取文件,提升代码效率
内容的提问来源于stack exchange,提问作者Addy
相关产品推荐
相关产品推荐

