Python读取中文Excel问题解决

  • 为什么读取中文Excel会出错
  • 两个难题
  • 试验结果

为什么读取中文Excel会出错

在计算机中,一个字节(byte)有8个比特,即可以表达2^8次方即256个字符,一个英文字母或符号占一个字节,即ASCII码。ASCII码有意只编了128个。

但是这个表达对于其他语言是不够用的,特别是东亚文字。于是上世纪八九十年代出现了很多并行的编码表,将2个字节对应为日文、韩文、简体或繁体汉字。Windows官方使用cp936的编码表,相当于gb18030. 所以在Windows系统里,不论是文本内容,还是文件名,都是以它来解码的。

这样就造成了两种错误,一是如果以ASCII码去读,会发生错误(因为还有128种字节不被ASCII定义),这就逼的程序去指定编码表。但是依然会发生编码表错误,即错误解码,例如原来是日文的编码错解成gb18030就会出错,形成乱码。

后来又出现了UTF-8,用1-3个字节将所有的语言的字符都包括进来,1-3个字节是为了兼容ASCII,实际可以只用2个字节,而2个字节的是unicode,规定内存中使用。

这样,尽管在内存中字节是通用的unicode,但是永久存储却有多种编码,即便都是中文,也有cp936, gb2312, gbk, gb18030和utf-8几种. 我忘了cp936是对应哪种gb了,但是一个割裂的后果是微软体系只要安装时指定简体中文,都用cp936,而后来流行的网页,Linux及新兴语言,特别是Python都默认utf-8.

两个难题

如上,一个是在Windows系统中运行,如果碰上中文文件名,必须用cp936或gb18030去解码它。如果你写了一个中文的文件名,而python根据utf-8规则去把它翻译成字节,就会在底层的文件名上不匹配,因为该中文在cp936的规则下翻译成另外的字节。报错是找不到该文件。

我参照了很多网上内容,有以下三种解决方法,前两种类似,是用unicode:

u'中文.xlsx'
r'中文.xlsx'
'中文.xlsx'.encode('cp936')

而最后一种直接指定解码出字节。最后一种经常是失效的,而前两种在所有的库中都可以调用,应该是被python底层支持了。

第二个难题是读取文件内容时正确指定编码。如果直接用Excel编辑,或者c#之类的插件生成的一般里面的文字是cp936的,而python的各excel库偏偏喜欢默认编码为utf-8

一个非常简单粗暴的办法是在加载了相应库之后,把Excel文件对象的encoding属性强行从utf-8更改:
xlrd改文件内容编码

xlrd.Book.encoding = "gbk"

这样即使库没有提供改编码接口,也实际改了。当然xlrd还提供了接口。
如果cp936的内容强行用utf-8去解,会发生报错

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position 64: invalid continuation byte

试验结果

xlrd和openpyxl可以同时解决以上两个问题, 下面是xlrd的一段代码。

import xlrd, xlwt
xlrd.Book.encoding = "cp936"
exl = xlrd.open_workbook(u'上海代码.xlsx')
print("首行为\n ", exl.sheets()[0].row_values(0) )

openpyxl也可以,但是它的语法过于复杂:

# a trial to see if openpyxl works
import openpyxl
openpyxl.Workbook.encoding="cp936"
book = openpyxl.load_workbook(u'上海代码.xlsx')
print(book.sheetnames)
sheet = book.active
print(sheet['A1'].value)

然后直接在cmd窗口进到相应目录运行它(注意用vscode可能被vscode自己默认的utf-8或工作路径污染出错),两个难题同时解决了

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Y>d:D:\>python openpyxl_.py
C:\Python37-32\lib\site-packages\openpyxl\styles\stylesheet.py:214: UserWarning:Workbook contains no default style, apply openpyxl's defaultwarn("Workbook contains no default style, apply openpyxl's default")
['Sheet0']
证券代码D:\>

下一篇会讲写excel。我看到通用的视频是讲xlwt或openpyxl,其实这两个都不实用。这些培训真是误人子弟。具体如何,下期再见。

Python读取中文Excel问题解决相关推荐

  1. python读取中文txt文本-python读取中文txt文本的方法

    对于python2.7 字符串在Python2.7内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码成unicode,再从unico ...

  2. python怎么读中文-python读取中文txt文本的方法

    对于python2.7 字符串在Python2.7内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码成unicode,再从unico ...

  3. Python读取中文路径时的处理

    Python读取中文路径时可能会出错:编码问题 方法一:路径拆分单独编码 <span style="font-size:14px;"># -*- coding: utf ...

  4. python txt默认读取字符还是行,python读取中文txt文本的方法

    字符串在Python2.7内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码成unicode,再从unicode编码成另一种编码. ...

  5. python如何读取中文文件-python读取中文txt文本的方法

    对于python2.7 字符串在Python2.7内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码成unicode,再从unico ...

  6. python读取文件路径中有中文_转 python 读取中文文件名/中文路径

    原博文 2015-03-13 22:22 − python直接读取中文路径的文件时失败,可做如下处理: inpath = 'D:/work/yuanxx/在线导航/驾车导航/walk_log/2013 ...

  7. python读取中文txt文本-Python3 解决读取中文文件txt编码的问题

    问题描述 尝试用Python写一个Wordcloud的时候,出现了编码问题. 照着网上某些博客的说法添添改改后,结果是变成了"UnicodeDecodeError: "utf-8' ...

  8. python读取中文文件报错-Python3 解决读取中文文件txt编码的问题

    问题描述 尝试用Python写一个Wordcloud的时候,出现了编码问题. 照着网上某些博客的说法添添改改后,结果是变成了"UnicodeDecodeError: "utf-8' ...

  9. python读取读excel,日期变成了数字,解决方法记录

    目录 1 问题描述 2 解决方案 3 后续解决措施 4 延伸,使用 xlrd 读取excel时出现数字的解决方法 5 参考文章 记录一下最近碰到的一个小问题. 1 问题描述 目标:使用Django从E ...

最新文章

  1. golang连接mysql报错:this authentication plugin is not supported 解决方案
  2. Keras中神经网络可视化模块keras.utils.visualize_util安装配置方法
  3. BZOJ4723[POI2017]Flappy Bird——模拟
  4. python零基础学习教程之Python 运算符
  5. SAP UI5 初学者教程之十四 - 嵌入视图的使用方式试读版
  6. 聚类分析在用户行为中的实例_看完这篇,你还敢说不懂聚类分析?
  7. 禅道项目管理工具环境搭建
  8. 运算放大器的输入失调电压、失调电压漂移、输入偏置电流、输入失调电流、输入/输出电压范围、噪声指标
  9. 数据结构学习笔记-树
  10. Android studio 4.0 offline mode
  11. P5208-[WC2019] I 君的商店【交互,二分】
  12. 2022元旦首发,2021年阿里春招+秋招+社招+校招Java后端开发面试题汇总,看完轻松收下offer
  13. SSD或者机械硬盘的读取速度查询
  14. VB 让图片自动适应picturebox控件大小的方法
  15. Docker中的网络模式
  16. 线上卖房子,VR、直播成趋势
  17. cdh YARN服务启用Uber优化
  18. 转载:Maven实战—Dependencies与DependencyManagement的区别
  19. 为何你的生活那么无趣?
  20. springSecurity标签,特别是@PreAuthorize

热门文章

  1. Android 设置屏幕亮屏
  2. 网管培训教程之DOS篇
  3. 杨辉三角,输入n,输出n行的杨辉三角
  4. MES制造执行系统概述连载(一)
  5. cordova编译crosswalk-webview插件报错的处理办法
  6. 教育APP开发的特点体现
  7. ZBrush 4R7正式上线
  8. Zbrush 4R7中镜像教程
  9. 【C语言笔记】【宏定义系列】 整数乘以分数
  10. QT中Model-View-Delegate委托代理机制用法介绍