如何用Python自动将文本文件中的数据写入Excel?
文本数据写入Excel失败问题修复
我需要将文本文件中的数值数据写入Excel文件(由于数据的写入格式问题,Pandas无法使用),但多次尝试均未成功。此前使用openpyxl也未取得成功,最近尝试的代码如下:
wb = w.Workbook('D:\\IJS\\JEFF444.xlsx') ws = wb.add_worksheet() with open(trimmed_data, 'r') as file: lines = file.readlines() row = 8 for index in range(len(lines)): if len(lines[index].split()) != 0: lst = lines[index].split() print(lst) if lst[-1][-3:] == '444': print(lst[3].split('/')[0]) ws.write(f'B{row}', lst[3].split('/')[0]) ws.write(f'E{row}', float(lines[index + 2].split()[1])) ws.write(f'F{row}', float(lines[index + 2].split()[1]) * float(lines[index + 2].split()[2])) ws.write(f'J{row}', float(lines[index + 5].split()[1])) ws.write(f'K{row}', float(lines[index + 5].split()[1]) * float(lines[index + 5].split()[2])) ws.write(f'O{row}', float(lines[index + 8].split()[1])) ws.write(f'P{row}', float(lines[index + 8].split()[1]) * float(lines[index + 8].split()[2])) ws.write(f'T{row}', float(lines[index + 11].split()[1])) ws.write(f'U{row}', float(lines[index + 11].split()[1]) * float(lines[index + 11].split()[2])) row += 1 file.close() wb.close()
问题分析
- Workbook操作错误:如果使用的是
xlsxwriter,它的Workbook对象没有close()方法,需用save()完成文件保存;若用openpyxl,初始化和写入方式也和当前代码不匹配。 - 索引越界风险:循环中直接使用
index + 2、index + 11等索引,当index接近文本末尾时,会超出列表长度导致崩溃。 - 冗余操作与格式风险:多次重复调用
split(),且未判断拆分后元素数量,一旦数据格式异常就会报错。 - 冗余文件关闭:
with open会自动关闭文件,无需手动调用file.close()。
修复后的代码(以xlsxwriter为例)
import xlsxwriter # 初始化Excel工作簿 wb = xlsxwriter.Workbook('D:\\IJS\\JEFF444.xlsx') ws = wb.add_worksheet() with open(trimmed_data, 'r') as file: lines = file.readlines() row = 8 # 遍历索引时预留足够余量,避免index+11超出列表长度 for index in range(len(lines) - 11): current_line = lines[index].strip() if not current_line: continue line_parts = current_line.split() print(line_parts) # 检查最后一个元素是否以"444"结尾 if line_parts and line_parts[-1].endswith('444'): # 写入B列数据 ws.write(f'B{row}', line_parts[3].split('/')[0]) # 处理index+2行的数据 line_2 = lines[index + 2].strip() if line_2: parts_2 = line_2.split() if len(parts_2) >= 3: val = float(parts_2[1]) ws.write(f'E{row}', val) ws.write(f'F{row}', val * float(parts_2[2])) # 处理index+5行的数据 line_5 = lines[index + 5].strip() if line_5: parts_5 = line_5.split() if len(parts_5) >= 3: val = float(parts_5[1]) ws.write(f'J{row}', val) ws.write(f'K{row}', val * float(parts_5[2])) # 处理index+8行的数据 line_8 = lines[index + 8].strip() if line_8: parts_8 = line_8.split() if len(parts_8) >= 3: val = float(parts_8[1]) ws.write(f'O{row}', val) ws.write(f'P{row}', val * float(parts_8[2])) # 处理index+11行的数据 line_11 = lines[index + 11].strip() if line_11: parts_11 = line_11.split() if len(parts_11) >= 3: val = float(parts_11[1]) ws.write(f'T{row}', val) ws.write(f'U{row}', val * float(parts_11[2])) row += 1 # xlsxwriter通过save()完成保存并关闭工作簿 wb.save()
额外注意事项
- 若改用
openpyxl,需调整写法:创建Workbook后获取活动工作表,用ws.cell(row=row_num, column=col_num).value = 数据赋值(行列从1开始)。 - 确保
trimmed_data是正确的文本文件路径,无拼写错误。 - 文本数据格式不稳定时,需增加更多判断逻辑,避免因数据缺失或格式异常导致报错。
内容的提问来源于stack exchange,提问作者GustavusAdolphus
相关产品推荐
相关产品推荐

