遇ValueError: I/O operation on closed file: csvreader,已获权限求解决
排查你的CSV读取错误问题
嘿,我来帮你分析这个ValueError: I/O operation on closed file的问题,还有你代码里的逻辑小bug:
为什么会出现这个错误?
最可能的原因是代码缩进错误:如果你的第二个for row in reader循环没有缩进在with代码块内部,那当with块执行完毕后,系统会自动关闭文件f,这时候再用依赖这个文件的csv.reader,自然会触发“操作已关闭文件”的报错。
另外,就算缩进没问题,你的代码逻辑本身也走不通:csv.reader返回的是一次性迭代器,第一次for row in reader循环已经把所有行都遍历完了,文件指针直接跳到末尾,第二个循环根本读不到任何内容,没法拿到最后一行。
怎么修正?
给你两种简单的修正方案,按需选择:
方案1:直接记录最后一行(效率最高)
不用绕弯子统计行数,遍历的时候直接更新最后一行的记录就行,循环结束后剩下的就是最后一行:
import csv # 注意路径前面加r,避免Windows反斜杠的转义问题 with open(r'C:\Users\legos\OneDrive\Desktop\firebase.csv', 'rt') as f: reader = csv.reader(f, delimiter=',') lasturl = None for row in reader: lasturl = str(row) # 每次循环都覆盖,最后保存的就是最后一行数据 if lasturl: # 避免文件为空的情况 print(lasturl)
方案2:先把所有行存成列表(适合需要多次访问行数据的场景)
如果之后还要用到其他行的数据,可以先把所有行转成列表,这样就能随便访问任意行了,包括最后一行:
import csv with open(r'C:\Users\legos\OneDrive\Desktop\firebase.csv', 'rt') as f: reader = csv.reader(f, delimiter=',') rows = list(reader) # 把迭代器转成列表,可重复访问 if rows: lasturl = str(rows[-1]) # 直接取列表最后一个元素 print(lasturl)
另外提醒下:Windows路径里的反斜杠\要特别注意,要么用原始字符串(前面加r),要么把反斜杠改成\\,不然像\U这种会被当成Unicode转义字符,导致路径解析失败。
内容的提问来源于stack exchange,提问作者Harris B
相关产品推荐
相关产品推荐

