无法写入读取数据的CSV文件,Excel单元格拆分与行写入异常问题
手动生成符合Excel识别的CSV文件
问题场景
手里有个10行的矩阵(每行对应原CSV的一条数据),要把这些数据加上计算好的「Nota Final」(最终成绩)写回CSV,要求不能用Python的csv模块。现有代码生成的文件在Excel里显示异常,内容没有拆分到单个单元格,格式完全不符合预期。
现有代码
def escribir(): columna = ["Nombre","Carnet","Examen","Proyecto","Nota Final"] datos = [str(matriz[0]),"\n",str(matriz[1]),"\n",str(matriz[2]),"\n",str(matriz[3])," \n",str(matriz[4]),"\n",str(matriz[5]),"\n",str(matriz[6]),"\n",str(matriz[7]),"\n",str(matriz[8])," \n",str(matriz[9])] archivo = open("archivo.csv","w") archivo.writelines(columna) archivo.writelines(datos) archivo.close()
当前错误输出(Excel中显示)
NombreCarnetExamenProyectoNota Final['Juan', 'B48670', '80', '92', '86.0'] ['Maria', 'B98635', '85', '89', '87.0'] ['Marcela', 'B65872', '100', '70', '85.0'] ['Enrique', 'C08563', '87', '95', '91.0'] ['Luis', 'B86763', '92', '85', '88.5'] ['Osvaldo', 'C15860', '85', '80', '82.5'] ['Heidi', 'C25863', '70', '75', '72.5'] ['Fernando', 'C35964', '65', '80', '72.5'] ['Gerardo', 'C45790', '60', '60', '60.0'] ['Estefania', 'B95605', '96', '90', '93.0']
期望的CSV格式
Nombre, Carnet, Examen, Proyecto, Nota Final Juan,B48670,80,92, Maria,B98635,85,89, Marcela,B65872,100,70, Enrique,C08563,87,95, Luis,B86763,92,85, Osvaldo,C15860,85,80, Heidi,C25863,70,75, Fernando,C35964,65,80, Gerardo,C45790,60,60, Estefania,B95605,96,90,
问题原因&修正方案
现有代码的核心问题:
- 列名直接用
writelines写入,没有用逗号分隔,导致Excel把所有列名当成一个单元格内容 - 把矩阵的行转成字符串(
str(matriz[0])),输出后带列表的[]和元素引号,Excel无法识别为多个单元格 - 换行符混用了普通换行和带空格的换行,导致格式混乱
修正后的代码:
def escribir(): # 列名用逗号+空格连接,最后加换行符 columna_linea = ", ".join(["Nombre","Carnet","Examen","Proyecto","Nota Final"]) + "\n" # 处理每行数据:用逗号连接元素,最后加逗号(匹配期望格式),再换行 datos_lineas = [] for fila in matriz: # 取前4个元素,最后留空(对应期望的末尾逗号) fila_str = ",".join(fila[:4]) + ",\n" datos_lineas.append(fila_str) # 用with语句自动管理文件,避免忘记关闭 with open("archivo.csv","w") as archivo: archivo.write(columna_linea) archivo.writelines(datos_lineas)
补充说明
- 用
", ".join()把列名拼接成带逗号分隔的字符串,Excel会自动拆分到不同单元格 - 遍历矩阵的每一行,取前4个元素用逗号连接,末尾加逗号(匹配你要的格式),再换行
- 使用
with语句操作文件,无需手动调用close(),更安全可靠 - 如果后续要把「Nota Final」的数值填进去,只需要修改
fila_str = ",".join(fila[:4]) + "," + str(fila[4]) + "\n"即可
内容的提问来源于stack exchange,提问作者Santiago Rojas
相关产品推荐
相关产品推荐

