使用Python的openpyxl将TXT数据写入Excel时跳行,求问题排查
排查openpyxl写入Excel时隔行跳过的问题
嘿,我来帮你揪出这个隔行写入的bug!用openpyxl做文件转写时碰到这种情况,基本逃不开这几个常见的坑,咱们一个个拆解:
1. 手动维护行号时重复递增(最常见)
很多人习惯手动给row_num加1,但一不小心就会在循环里多写一次递增,或者同时混用了ws.append()和手动行号赋值——append()本身会自动把数据加到下一行,这时候再手动加行号,自然就会跳行了。
举个错误示范:
from openpyxl import Workbook wb = Workbook() ws = wb.active row_num = 1 with open("data.txt", "r") as f: for line in f: ws.cell(row=row_num, column=1, value=line.strip()) row_num += 1 # 不小心多写了一次,或者在别的逻辑里又加了一次row_num row_num += 1
解决办法:要么严格检查循环里的行号递增逻辑,确保每次循环只加一次;要么直接用ws.append()方法,它会自动帮你定位到下一行,完全不用手动管行号:
with open("data.txt", "r") as f: for line in f: ws.append([line.strip()]) # 把数据放进列表,append会自动追加到末尾行
2. 遍历行的同时修改工作表结构
如果你用iter_rows()或iter_cols()遍历工作表的同时,又做了插入/追加行的操作,openpyxl的迭代器会因为工作表结构变化而“迷路”,导致跳过行。比如:
for row in ws.iter_rows(min_row=1, max_row=ws.max_row): # 遍历过程中追加行,会打乱迭代器的遍历逻辑 ws.append(["new content from txt"])
解决办法:先把TXT里的所有数据读取到一个列表里,再一次性写入Excel,避免边遍历边修改:
data_list = [] with open("data.txt", "r") as f: data_list = [line.strip() for line in f if line.strip()] # 顺便过滤空白行 # 一次性写入 for item in data_list: ws.append([item])
3. TXT文件本身存在空白行
有时候不是代码的锅,是你的源TXT文件里本来就每隔一行有空白行,写入Excel后自然看起来像是跳行。
解决办法:读文件的时候过滤掉空白行:
with open("data.txt", "r") as f: for line in f: clean_line = line.strip() if clean_line: # 只处理非空的行 ws.append([clean_line])
4. 错误使用插入行操作
如果你的代码里用了ws.insert_rows()来插入行,然后手动维护行号时逻辑出错,也会导致跳行。比如每次插入后错误地递增行号,导致跳过了一行:
row_num = 1 with open("data.txt", "r") as f: for line in f: ws.insert_rows(row_num) ws.cell(row=row_num, column=1, value=line.strip()) row_num += 1 # 这里错了:insert后原来的row_num位置已经被新行占据,下一次插入应该还是row_num,而不是+1
解决办法:要么改用append()(更简单),要么调整行号逻辑:
row_num = 1 with open("data.txt", "r") as f: for line in f: ws.insert_rows(row_num) ws.cell(row=row_num, column=1, value=line.strip()) row_num += 2 # 或者根据实际需求调整,不过还是append香
先从手动行号和append()混用的情况查起,这是最容易踩的坑!
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

