从文本文件提取记录写入CSV后导入异常:每个字符单独占据单元格
问题分析与解决
你的代码主要有两个核心问题导致CSV写入异常,咱们一步步拆解:
1. 缺少csv模块导入
你的代码里使用了csv.writer,但没有先导入csv模块,这会直接引发运行时错误,先补上这行:
import csv
2. writer.writerows()的用法错误
writer.writerows()接受的是包含多行数据的可迭代对象,每一行需要是一个包含列值的列表/元组。但你传入的last_line是一个字符串,Python会把字符串当成字符的迭代器,所以每个字符被单独写入一个单元格,这就是你看到的异常。
另外,你读取文件的代码里有冗余逻辑:前面定义的stripped和lines生成器完全没被使用,直接用in_file.read().splitlines()读取所有行就足够了。
修正后的完整代码
import csv # 读取输入文件,获取倒数第三行 with open('report.txt', 'r') as in_file: all_lines = in_file.read().splitlines() # 确保文件至少有3行,避免索引越界 if len(all_lines) >= 3: last_line = all_lines[-3] print(last_line) else: print("文件行数不足3行,无法提取目标行") exit() # 写入CSV文件 with open('log.csv', 'w', newline='') as out_file: writer = csv.writer(out_file) # 写入表头 writer.writerow(('date', 'time', 'val')) # 将目标行按逗号分割成列表,写入单行数据 writer.writerow(last_line.split(','))
关键修正点说明
- 加入了
import csv,确保能使用CSV模块 - 移除了冗余的生成器代码,简化文件读取逻辑
- 增加了文件行数判断,避免因文件过短引发
IndexError - 使用
writer.writerow()(单数)写入单行数据,并且先把last_line按逗号分割成列表,这样CSV会自动将每个元素对应到一列 - 打开输出文件时加入
newline='',这是Python官方推荐的写法,避免Windows系统下写入CSV出现多余空行
这样处理后,你的CSV文件就会正确将日期、时间、数值分别放在三个单元格里,导入时不会再出现异常。
内容的提问来源于stack exchange,提问作者so.h
相关产品推荐
相关产品推荐

