Python2写csv文件中文乱码问题及解决方法详解

Crq
Crq
管理员
1866
文章
0
粉丝
Linux教程评论10字数 690阅读2分18秒阅读模式
摘要python2最大的坑在于中文编码问题,遇到中文报错首先加u,再各种encode、decode,这篇文章给大家介绍Python2写csv文件中文乱码问题及解决方法,感兴趣的朋友跟随...
前言

python2最大的坑在于中文编码问题,遇到中文报错首先加u,再各种encode、decode。当list、tuple、dict里面有中文时,打印出来的是Unicode编码,这个是无解的。对中文编码纠结的建议尽快换python3吧,python2且用且珍惜!

csv中文乱码

1.open打开csv文件,用writer写入带有中文的数据时

writer写入单行writers写入多行

# coding:utf-8
import csv
f = open("xieru.csv", 'wb')
writer = csv.writer(f)
# 需要写入的信息
data = ["客户名称", "行业类型", "客户联系人", "职位", "联系方式", "邮箱","地址"]
writer.writerow(data)       # 写入单行
# writer.writerows(datas)    # 写入多行
f.close()

2.打开csv文件,发现写入的中文乱码了

编码与解码

1.中文乱码问题一直是python2挥之不去的痛,这里先弄清楚乱码原因:

  • python2本身内部代码的编码有str和unicode两种编码
  • 然而文件写入到windows系统时候,windows上的是gb2312编码
  • 所以就导致了乱码问题

    2.先把python里面的中文字符串decode成utf-8,再encode为gbk编码

    data.decode('utf-8').encode('gbk')

    3.如果是读取csv文件的话,就反过来:

    data.decode('gbk').encode('utf-8')
    解决方案

    1.方案一:对字符串转换编码(这个太麻烦了,不推荐)

    # coding:utf-8
    import csv
    f = open("xieru1.csv", 'wb')
    writer = csv.writer(f)
    # 需要写入的信息
    data = ["客户名称", "行业类型", "客户联系人", "职位", "联系方式", "邮箱","地址"]
    a = []
    for i in data:
        a.append(i.decode("utf-8").encode("gbk"))
    writer.writerow(a)           # 写入单行
    # writer.writerows(datas)    # 写入多行
    f.close()

    2.方法二:用codecs提供的open方法来指定打开的文件的语言编码,它会在读取的时候自动转换为内部unicode (推荐)

    # coding:utf-8
    import csv, codecs
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')
    f = codecs.open("xx.csv", 'wb', "gbk")
    writer = csv.writer(f)
    writer.writerow(["客户名称", "行业类型", "客户联系人", "职位", "联系方式", "邮箱","地址"])
    # 多组数据存放list列表里面
    datas = [
        ["客户名称", "行业类型", "客户联系人", "职位", "联系方式", "邮箱","地址"],
        ["客户名称", "行业类型", "客户联系人", "职位", "联系方式", "邮箱","地址"],
        ["客户名称", "行业类型", "客户联系人", "职位", "联系方式", "邮箱","地址"],
           ]
    writer.writerows(datas)
    f.close()
    python写入csv文件时的乱码问题

    今天在使用python的csv库将数据写入csv文件时候,出现了中文乱码问题,解决方法是在写入文件前,先指定utf-8编码,如下:

    import csv
    import codecs
    if __name__ == "__main__":
        file_name = "data.csv"
        with open(file_name, "wb") as f:
            f.write(codecs.BOM_UTF8)
            csv_write = csv.writer(f)
            csv_write.writerows([["姓名", "年龄"], ["张三", 18]])

    得到csv文件,正确的显示了中文。

    weinxin
    我的微信
    微信号已复制
    我的微信
    这是我的微信扫一扫
     
    Crq
    • 本文由 Crq 发表于2025年3月13日 06:37:09
    • 转载请注明:https://www.cncrq.com/13427.html
    Mysql之全表扫描成本计算 Linux教程

    Mysql之全表扫描成本计算

    计算读取一个数据页的平均成本,关键是要知道主键索引已经加载到 Buffer Pool 中的叶子结点数量。InnoDB 通过在内存中维护一个哈希表(buf_stat_per_inde...
    【技术快报】9.19-9.25 Linux教程

    【技术快报】9.19-9.25

    本期《linux就该这么学》的技术周报中,将为您推出最牛X的GCC 内联汇编、Inxi:获取Linux系统和硬件信息的神器、使用 Github Pages 发布你的项目文档、5分钟...
    Linux文件读写机制及优化方式 Linux教程

    Linux文件读写机制及优化方式

    Linux是一个可控性强的,安全高效的操作系统。本文只讨论Linux下文件的读写机制,不涉及不同读取方式如read,fread,cin等的对比,这些读取方式本质上都是调用系统api...
    匿名

    发表评论

    匿名网友
    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
    确定

    拖动滑块以完成验证