Python写入文件异常:Ham内容未写入CSV但控制台有输出
问题分析与解决方案
我一眼就看出你这问题的核心了——文件写入的时机和模式用错了,虽然ham分支的代码确实执行了,但最终内容没留在CSV里,大概率是被反复覆盖掉了。
核心原因
你把with open(output_file, 'w') as dest:放在了os.walk的循环内部,这意味着每遍历一个文件夹,就会重新打开一次目标CSV文件,而且用的是'w'(写入模式):这个模式会直接清空文件里已有的内容,然后从头开始写。比如如果先处理了spam文件所在的文件夹,写入了spam内容,之后处理ham文件夹时,重新打开文件会直接把之前的spam内容清空,要是后续没有再写入spam,最终文件里可能只剩最后一次写入的内容(或者如果ham的写入逻辑有格式问题,就会完全看不到)。
另外还要确认你在else分支(ham)里的写入代码是否完整,比如有没有正确调用dest.write(),并且给每行内容加上换行符\n,不然内容会挤在一起甚至无法正确写入。
修正方案
- 把文件打开操作移到循环最外层:整个程序只打开一次CSV文件,避免反复清空内容。
- 用更规范的方式处理CSV写入:建议借助Python内置的
csv模块,避免手动拼接字符串导致的格式错乱。 - 确保ham的判断和写入逻辑完整:确认能正确识别ham文件,并且把内容按CSV格式写入。
修正后的代码示例
import os import csv root_dir = '../res' output_file = '../res/mass.csv' # 把文件打开移到最外层,整个过程只初始化一次文件 with open(output_file, 'w', newline='') as dest: # 用csv.writer处理格式更稳妥 csv_writer = csv.writer(dest) # 先写入CSV表头(按需调整) csv_writer.writerow(['content', 'label']) for folder, subs, files in os.walk(root_dir): for filename in files: if filename != 'Summary.txt': file_full_path = os.path.join(folder, filename) # 根据你的实际情况判断spam/ham,这里假设文件夹名或文件名包含标识 if 'spam' in folder.lower() or 'spam' in filename.lower(): label = 'spam' print('spam....') else: label = 'ham' print('ham....') # 读取目标文件内容(根据文件类型调整编码和读取方式) with open(file_full_path, 'r', encoding='utf-8', errors='ignore') as src_file: content = src_file.read().strip() # 写入CSV行 csv_writer.writerow([content, label])
额外提醒
- 如果你的原代码是手动拼接字符串写入CSV,一定要处理内容里的逗号、双引号等特殊字符,不然会导致CSV格式错乱,看起来像是内容没写入。
- 确认
ham的判断逻辑是准确的,比如确实能匹配到ham文件或文件夹。 - 用
newline=''打开CSV文件是Python官方推荐的方式,能避免不同操作系统下的换行符混乱问题。
内容的提问来源于stack exchange,提问作者jordan
相关产品推荐
相关产品推荐

