Python批量转换CSV为制表符分隔TXT及StopIteration错误排查
解决CSV转制表符TXT时的StopIteration与文件清空问题
看起来你在批量处理CSV转TXT的时候踩了两个常见的坑:StopIteration异常和原CSV文件被清空,我来帮你捋清楚问题根源,再给你一套靠谱的解决方案。
问题根源分析
- StopIteration错误:你用
next(csv_file)跳过标题行时,如果某个CSV文件只有标题行(没有任何数据行),迭代器走到末尾就会抛出这个异常——因为next()找不到下一个元素了。 - 原文件被清空:十有八九是你打开CSV文件时用了
w(写入)模式而不是r(只读)模式。一旦用w模式打开文件,系统会直接清空原文件内容,这可是致命操作!
靠谱的批量处理代码
下面是经过验证的代码,既解决了异常问题,又绝对不会修改原CSV文件:
首先导入必要的模块:
import csv import os
方案1:所有CSV数据合并到一个TXT文件
如果需要把所有CSV的内容(跳过标题后)追加到同一个制表符分隔的TXT里,用这个函数:
def batch_csv_to_single_txt(csv_folder, output_txt_path): # 遍历目标文件夹下所有CSV文件 for filename in os.listdir(csv_folder): if not filename.endswith('.csv'): continue # 跳过非CSV文件 csv_full_path = os.path.join(csv_folder, filename) print(f"正在处理: {filename}") try: # 只读模式打开CSV,绝对不会修改原文件 with open(csv_full_path, 'r', encoding='utf-8') as csv_file: csv_reader = csv.reader(csv_file) # 安全跳过标题行:捕获StopIteration,处理空数据的CSV try: next(csv_reader) except StopIteration: print(f"⚠️ 警告: {filename}只有标题行,没有数据,已跳过") continue # 追加模式打开TXT,避免覆盖已有内容 with open(output_txt_path, 'a', encoding='utf-8') as txt_file: for row in csv_reader: # 将CSV的逗号分隔转为制表符分隔 txt_line = '\t'.join(row) + '\n' txt_file.write(txt_line) except Exception as e: print(f"❌ 处理{filename}出错: {str(e)}")
调用示例(替换成你的路径):
# 你的CSV文件所在文件夹路径 csv_dir = "./my_csv_files" # 输出TXT文件路径 output_txt = "./all_data_combined.txt" batch_csv_to_single_txt(csv_dir, output_txt)
方案2:每个CSV对应生成一个TXT文件
如果需要每个CSV单独转成同名的TXT文件,用这个版本:
def batch_csv_to_individual_txt(csv_folder): for filename in os.listdir(csv_folder): if not filename.endswith('.csv'): continue csv_full_path = os.path.join(csv_folder, filename) # 生成对应的TXT文件名 txt_filename = os.path.splitext(filename)[0] + ".txt" txt_full_path = os.path.join(csv_folder, txt_filename) print(f"正在转换: {filename} → {txt_filename}") try: with open(csv_full_path, 'r', encoding='utf-8') as csv_file: csv_reader = csv.reader(csv_file) try: next(csv_reader) except StopIteration: print(f"⚠️ 警告: {filename}无数据,生成空TXT") with open(txt_full_path, 'w', encoding='utf-8') as txt_file: for row in csv_reader: txt_line = '\t'.join(row) + '\n' txt_file.write(txt_line) except Exception as e: print(f"❌ 转换{filename}出错: {str(e)}")
调用示例:
csv_dir = "./my_csv_files" batch_csv_to_individual_txt(csv_dir)
关键注意点
- 永远用
r模式读取CSV文件,用w/a模式写入TXT——千万别搞混! - 用
with语句管理文件,它会自动帮你关闭文件,避免资源泄漏和意外问题。 - 加入异常捕获,就算某个CSV文件损坏,也不会导致整个批量处理中断。
内容的提问来源于stack exchange,提问作者London Ashobo
相关产品推荐
相关产品推荐

