不使用pandas写入CSV时单元格排布异常问题求解
问题原因
csv.writerows() 要求传入的参数是二维可迭代对象:最外层的每个元素对应CSV的一行,行元素内的每个子元素对应该行的一个单元格。
你传入的j1_list是一维字符串列表,而Python中字符串本身属于可迭代对象,因此writerows()会自动把每个字符串拆成单个字符,每个字符单独占一行、放入独立单元格,最终就出现了你看到的数字拆分问题。
之前用writerow(j1_list)时,是把整个j1_list当作单行内容写入,所以所有值都会挤在同一行,不符合按列排布的需求。
修复方案
要实现每个数值单独占一行、按列排布的效果,只需要把每个数值包装成单元素列表再传给writerows(),或者直接循环调用writerow()写入单个值即可。
另外你现有代码还存在几个可修正的问题:
- 重复遍历7次目录、编写7个逻辑完全一致的读取方法,冗余度过高
- 类中定义的方法未加静态方法装饰器,调用逻辑不规范
- 打开CSV文件写入时未加
newline=''参数,Windows环境下会自动插入多余空行 - 路径拼接直接用字符串格式化容易出现转义错误,推荐用
os.path.join处理
修正后的写入代码
import csv import os # 数据读取完成后,写入部分替换为以下逻辑 with open('C:/Users/DunningJ3/Desktop/sample.csv', 'w', newline='', encoding='utf-8') as wf: writer = csv.writer(wf) # 单列表按单列写入 for value in j1_list: writer.writerow([value]) # 如果需要同时写入j1-j7共7列数据,用zip按行对齐即可 # for row in zip(j1_list, j2_list, j3_list, j4_list, j5_list, j6_list, j7_list): # writer.writerow(row)
代码优化参考
可以把重复的读取逻辑合并,无需多次遍历目录、重复编写方法:
def read_target_value(filepath, line_idx, val_start=5, val_end=16): with open(filepath, 'r', encoding='utf-8') as f: lines = f.readlines() return lines[line_idx][val_start:val_end] if __name__ == "__main__": # 配置要读取的行号与对应存储列表 read_task = [ (46, j1_list := []), (47, j2_list := []), (48, j3_list := []), (48, j4_list := []), (49, j5_list := []), (50, j6_list := []), (51, j7_list := []) ] # 仅遍历一次目标目录 for file in os.listdir(path): if file.endswith(".ls"): file_path = os.path.join(path, file) for line_num, res_list in read_task: res_list.append(read_target_value(file_path, line_num)) # 后续接CSV写入逻辑即可
注:原代码中j3、j4均读取索引为48的行,如果是笔误可自行调整对应行号。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

