0
点赞
收藏
分享

微信扫一扫

Python 处理带中文 Excel 文件



Python 处理带中文 Excel 文件


  • ​​Python-Excel常规操作​​

  • ​​安装库​​
  • ​​写入 Excel​​
  • ​​读取 Excel​​
  • ​​测试文件​​
  • ​​处理中文​​
  • ​​Ref​​
  • ​​所遇到问题​​



Python-Excel常规操作

注意,是 ​​xls​​​ 文件,不是 ​​xlsx​​ 文件

安装库

$ pip3 install xlrd xlwt xlutils

安装比较简单,直接用 pip 工具安装三个库即可,安装命令如下:

安装完成提示 ​​Successfully installed xlrd-1.2.0 xlutils-2.0.0 xlwt-1.3.0​​ 即表示安装成功。

写入 Excel

接下来我们就从写入 Excel 开始,话不多说直接看代码如下:

# excel_w.py

# 导入 xlwt 库
import xlwt

# 创建 xls 文件对象
wb = xlwt.Workbook()

# 新增两个表单页
sh1 = wb.add_sheet('成绩')
sh2 = wb.add_sheet('汇总')

# 然后按照位置来添加数据,第一个参数是行,第二个参数是列
# 写入第一个sheet
sh1.write(0, 0, '姓名')
sh1.write(0, 1, '成绩')
sh1.write(1, 0, '张三')
sh1.write(1, 1, 88)
sh1.write(2, 0, '李四')
sh1.write(2, 1, 99.5)

# 写入第二个sheet
sh2.write(0, 0, '总分')
sh2.write(1, 0, 187.5)

# 最后保存文件即可
wb.save('test_w.xls')

读取 Excel

测试文件

Python 处理带中文 Excel 文件_excel

Python 处理带中文 Excel 文件_python_02

# excel_r.py

# 导入 xlrd 库
import xlrd

# 打开刚才我们写入的 test_w.xls 文件
wb = xlrd.open_workbook("test_w.xlsx")

# 获取并打印 sheet 数量
print("sheet 数量:" + str(wb.nsheets))

# 获取并打印 sheet 名称
# Python 编码问题,需要单独输出
print( "sheet 名称如下:")
for i in wb.sheet_names():
print i
lis = (1)

# 根据 sheet 索引获取内容
sh1 = wb.sheet_by_index(0)
# 或者也可根据 sheet 名称获取内容
# sh = wb.sheet_by_name('成绩')

# 获取并打印该 sheet 行数和列数
# print( u"sheet" + str(sh1.name) + "共" + str(sh1.nrows) + "行" +str(sh1.ncols)+ "列")
print ("sheetName:")
print (sh1.name)
print ("行数:")
print (sh1.nrows)
print ("列数:")
print (sh1.ncols)

# 获取并打印某个单元格的值
print ("第一行第二列的值为:")
print (sh1.cell_value(0, 1))

# 获取整行或整列的值
rows = sh1.row_values(0) # 获取第一行内容
cols = sh1.col_values(1) # 获取第二列内容

# 打印获取的行列值
print ("第一行的值为:")
for i in rows:
print (i)
print ("第二列的值为:")
for j in cols:
print (j)

# 获取单元格内容的数据类型
print ("第二行第一列的值类型为:")
print (sh1.cell(1, 0).ctype)

# 遍历所有表单内容
# 遍历所有表单
for sh in wb.sheets():
# 遍历所有行数
for r in range(sh.nrows):
# 遍历所有列数
for l in range(sh.ncols):
# 打印指定单元格内容
print (sh.cell_value(r, l))

细心的朋友可能注意到,这里我们可以获取到单元格的类型,上面我们读取类型时获取的是数字1,那1表示什么类型,又都有什么类型呢?别急下面我们通过一个表格展示下:

数值

类型

说明

0

empty

1

string

字符串

2

number

数字

3

date

日期

4

boolean

布尔值

5

error

错误

通过上面表格,我们可以知道刚获取单元格类型返回的数字1对应的就是字符串类型。

处理中文

import xlrd
#import chardet
data = xlrd.open_workbook("emotion.xlsx")
table = data.sheets()[0]
nrows = table.nrows
for i in range(nrows):
#print chardet.detect(str(table.row_values(i)))
print table.row_values(i)

可是这样在Linux Terminal 打印出来的是乱码,把打印语句改成:

print str(table.row_values(i)).decode("unicode_escape").encode("utf8")

为什么是这样? 可以从Ubuntu 的系统设置中看到,控制器显示的字符是UTF8的,所以最后需要encode成UTF8的,2.为什么要用decode? 因为要encode成UTF8,得是unicode格式的字符串才行,但是默认的字符串是str型的,所有需要把其他的字符编码转成UNICODE才行,然后,因为打印出来的乱码是. u’\XXX’ 这种形式, 所以根据经验应该是unicode_escape形式。

Ref


  1. ​​Python 操作 Excel​​
  2. ​​官方文档​​
  3. ​​Python 处理中文 Excel​​
  4. ​​‘ascii’ codec can’t decode byte 0xef in position 0: ordinal not in range(128)​​
  5. ​​Python——str字符串和unicode字符串​​
  6. ​​用python操作excel的强大工具:openpyxl(附上实例脚本)​​
  7. ​​Python读写Excel表格,就是这么简单粗暴又好用​​

所遇到问题


  1. 使用了 ​​pip3 install xlrd xlutils xlwt​​ 安装扩展包,也使用 ​​pip list​​ 和 ​​pip3 list​​ 指令均可以查找到此扩展包已被安装,但只能在 ​python2​ 中执行 ​​import xlrd​​ 指令,在 ​python3​ 中无法导入。
    暂未解决。
  2. Python​ 编码指令问题。读取 ​Excel​ 文件后,执行 ​​print​​ 打印出来的是 ​​\xe6\x95\xb0\xe9\x87\x8f​​ 或 ​​u'\u6210\u7ee9'​
  3. ‘ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)


举报

相关推荐

0 条评论