合并目录文件时Python for循环无法迭代问题求助
问题分析与修复方案
你的代码核心问题是多余的嵌套循环导致程序卡在第一个文件的重复处理中,同时还有几个细节错误需要修正,我来一步步帮你解决:
你的代码存在的主要问题
- 完全冗余的内层循环:你在遍历每个文件后,又嵌套了
for row in reader和for field in row,这会让程序反复打开同一个文件并写入内容,根本没机会进入下一个文件的循环——相当于第一个文件被处理了「行数×列数」次,后面的文件永远轮不到。 - 文件打开模式错误:Python 3中
csv.reader要求使用文本模式打开文件,你用'rb'二进制模式会直接报错。 - 缺失必要模块导入:代码里用到了
islice,但没有导入itertools.islice,运行时会抛出NameError。 - 行号计数误区:
islice(f, 22, None)会跳过前22行(索引从0开始),也就是从第23行开始读取。如果要从第22行开始,应该用islice(f, 21, None)(因为第22行的索引是21)。
修正后的代码
import csv import glob from itertools import islice # 定义目标文件路径和输出文件名 path = "/mnt/b818255b-46bc-4a89-9ef3-42138e2ad25f/PASST 4.0/Messdaten/*.lvm" output_file = "out.csv" # 优化:外层一次性打开输出文件,减少IO操作 with open(output_file, 'a', newline='', encoding='utf-8') as f_out: writer = csv.writer(f_out) # 遍历所有.lvm文件 for fname in glob.glob(path): print(f"正在处理文件: {fname}") # 可选:打印进度,方便调试 # 以文本模式打开当前.lvm文件 with open(fname, 'r', newline='', encoding='utf-8') as f_in: # 跳过前21行,从第22行开始读取(行号从1计数) # 如果需要跳过前22行,改成islice(f_in, 22, None) reader = csv.reader(islice(f_in, 21, None)) # 将当前文件的内容追加到输出CSV writer.writerows(reader) print("所有文件处理完成!")
额外说明
- 我把输出文件的打开放在了最外层,这样避免了每次处理文件都打开关闭输出文件,效率更高;
- 指定
newline=''是csv模块官方推荐的做法,可以避免不同操作系统下的换行符混乱; - 添加了
print语句来显示当前处理的文件,方便你跟踪进度,确认所有文件都被遍历到了。
内容的提问来源于stack exchange,提问作者Jovel
相关产品推荐
相关产品推荐

