Python导出csv中文乱码utf_8_sig没用

快捷定位目录

  • 问题描述
    • python读写文件基本操作
    • 网络上的解决方法
    • 我遇到的问题
  • 我的尝试解决
    • 解决过程
      • 解决思路
  • 使用python中to_csv()解决乱码问题需要注意
  • 根本原因

问题描述

python读写文件基本操作

在数据过滤操作中,常常需要对源文件(source)中的数据进行读取、分析、判别处理,而后再写入新的文件。在文件的读取上可以是.xlsx也可以是.csv,使用pandas如:pd.read_excel("source.xlsx"),可以对excel文件轻松读取,同样也可以读取csv文件。但在文件的写入上,python中excel文件写入比较复杂,不在赘述;相对而言csv文件较为完善,操作较为方便:首先建立一个字典变量a,而后使用b=DataFrame(a)将该变量转化为数据框架变量b,调用b的to_csv()函数写入文件即可,如下代码块所示:

import pandas as pd
out_value = {}
out_value["C_item1"] = [2 ,"投桃报李", 456.3]   # 此处赋值右侧变量必须为列表
out_value["C_item2"] = [2,"投桃报李", 456.3]  # 相当于横向列标题MaxHop下有三个值
dataframe = pd.DataFrame(out_value)
dataframe.to_csv("out.csv", mode='a', index=False, sep=',', header=False) 
# 说明:文件名, 模式追加模式加入新数据,不填写列表左侧表示行数的index,分隔符,不填写头题即:"C_item1""C_item2"等

网络上的解决方法

但需要写入的数据(或数据的一部分)是中文时,会出现中文变成乱码的情况,网上一般的解决办法是添加:encoding="utf_8_sig",即

dataframe.to_csv("out.csv", mode='a', index=False, sep=',', header=False, encoding="utf_8_sig")

我遇到的问题

在写入文件后,我的文件依然中是中文乱码,即便encoding="utf_8_sig"已经添加,但没用。


经过探索可能的原因是:

  1. .csv文件是我自己定义的,不是由python软件生成的
  2. .csv文件在追加写入之前我改动一下。因为我的文件是一条条写入,我不希望每次写入都带有header,但我又希望文件有header,所以我就手动的加了一行header。

图片替换文本
我的文件效果与源代码

我的尝试解决

解决过程

  1. 起初我认为是encoding的问题,但没效果
    用网上的经验,我添加了encoding="utf_8_sig"但没有任何效果。
    又猜想是否是dataframe.to_csv()参数顺序的问题,所以我将encoding参数提前,依旧没用
    又猜想是不是我参数过多,网上经验的示例参数都蛮少的:依旧没用
	使用 df.to_csv(file_name2, encoding='utf_8_sig') 后中文乱码问题解决了
	df.to_csv(file_name3,encoding="utf_8_sig")
  1. 猜想是不是代码首部没有指定编码格式的问题,添加后没有用
#!/usr/bin/python
# -*- coding: utf-8 -*-
  1. 陷入僵局,我只好把网上的经验代码完全照搬过来,结果真的没乱码
    直接原因就是产生了新的文件,在不修改产生的文件的前提下,继续追加写入,也是没有问题的:

    图片替换文本
    照搬网上经验产生的效果

    但一旦修改该文件,再次写入就又出现问题了:

    Python导出csv中文乱码utf_8_sig没用_第1张图片
    修改out文件,追加写入后,产生的效果

    我仅仅手动添加了一个单元格的字符,再次追加后追加内容的中文变为乱码,并且原有的内容也发生了改变(每行的内容全都挤压在了行首的单元格中)就很奇怪。

解决思路

奇怪归奇怪 ,但总算有解决问题的思路了。我就不修改就行了
用python产生csv文件,先写入一个行标题的header; 再按照业务的要求逐行追加数据内容。

使用python中to_csv()解决乱码问题需要注意

  1. 添加encoding="utf_8_sig",遇到乱码第一时间添加该参数,查看效果。
  2. 不要自定义csv文件,要尽量利用python自主产生的。mode='a' / mode='w',python会主动监测目标路径是否有你命名的文件存在,若不存在将自主创建。
  3. 当文件写操作没有全部完成时,千万不要对文件进行修改。稍微的修改可能使已有行的内容格式发生变化,并可能导致接下来继续写的中文内容变为乱码。
    即使你有像我一样仅需要一个行标题,而接下来一行行的追加时,又不需要标题的需求,你可以先写入一行标题,接下来再进行业务追加,写标题时只需要将行标题的内容指定为空list即可:
out_value[title[i]] = []
  1. 写入文件时字典变量内容填充的长度必须一致。
out_value["C_item1"] = [2 ,"投桃报李", 456.3]   # 此处赋值右侧变量必须为列表
out_value["C_item2"] = [2 ,"投桃报李", 456.3]   # 所有list的长度必须一致

根本原因

有待探索,欢迎大佬们指教!

你可能感兴趣的:(python,python,乱码,bug)