Python3中使用next函数为CSV新增列时遇StopIteration错误求助
解决CSV添加情感列时的StopIteration错误及代码问题
你遇到的StopIteration错误主要有两个核心原因,再加上代码里还有几个容易忽略的小问题,我帮你一步步梳理并修复:
问题根源分析
- 同时读写同一文件导致空读取:你在同一个循环里同时用
r和w模式打开了同一个CSV文件。w模式会立即清空文件内容,这就导致后续的csv.reader根本读不到任何行,调用next(reader)自然就抛出StopIteration了。 - 未处理空文件场景:即使文件原本有内容,如果后续逻辑出现异常导致reader为空,
next(reader)也会直接报错终止程序。 - 写入逻辑参数错误:最后一行
writer.writerows(row)是错误的,writerows需要接收一个可迭代的行列表(也就是你定义的all变量),而不是单个行对象row。
修复后的完整代码
import csv import os import glob from textblob import TextBlob path = '' extension = 'csv' os.chdir('./') results = [i for i in glob.glob(f'*.{extension}')] for result in results: print(result) # 第一步:先读取所有内容到内存,避免同时读写冲突 all_rows = [] try: with open(result, 'r', newline='') as csvfile: reader = csv.reader(csvfile) # 处理表头:捕获空文件的情况 try: header = next(reader) header.append('Sentiment') all_rows.append(header) # 处理数据行,同时避免索引越界 for row in reader: # 确保第3列存在再计算情感值 if len(row) >= 3: sentiment = TextBlob(row[2]).sentiment row.append(str(sentiment)) # 把元组转为字符串,适配CSV格式 else: row.append('N/A') # 缺失数据时标记占位 all_rows.append(row) except StopIteration: print(f"警告:文件 {result} 是空的,跳过处理") continue except Exception as e: print(f"读取文件 {result} 出错:{str(e)}") continue # 第二步:写入修改后的内容 try: with open(result, 'w', newline='') as csv1: writer = csv.writer(csv1, lineterminator='\n') writer.writerows(all_rows) print(f"文件 {result} 处理完成") except Exception as e: print(f"写入文件 {result} 出错:{str(e)}") print("所有文件处理完成")
关键修改点说明
- 分离读写操作:先把整个文件的内容读取到内存的
all_rows列表,关闭原文件后再打开写入,彻底避免了同时读写导致的文件清空问题。 - 捕获空文件异常:用嵌套
try-except处理空文件场景,程序不会直接崩溃,还会给出明确提示。 - 索引安全检查:添加
len(row)>=3的判断,避免某行数据缺失第3列时抛出索引错误。 - 修正写入参数:把
writer.writerows(row)改成writer.writerows(all_rows),确保所有处理后的行都能被写入。 - 情感值格式转换:TextBlob返回的
sentiment是元组类型,直接写入CSV会有格式问题,转为字符串后更适配CSV存储规则。
内容的提问来源于stack exchange,提问作者shivank01
相关产品推荐
相关产品推荐

