You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,不然内容会挤在一起甚至无法正确写入。

修正方案

  1. 把文件打开操作移到循环最外层:整个程序只打开一次CSV文件,避免反复清空内容。
  2. 用更规范的方式处理CSV写入:建议借助Python内置的csv模块,避免手动拼接字符串导致的格式错乱。
  3. 确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:04:46