Python3 对于中文文件的读写处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lilong117194/article/details/82563723

字符串在Python内部的表示是Unicode编码,因此,在做编码转换时,通常需要以Unicode作为中间编码,即先将其他编码的字符串解码(decode)成Unicode,再从Unicode编码(encode)成另一种编码。

在新版本的python3中,取消了unicode类型,代替它的是使用unicode字符的字符串类型(str),字符串类型(str)成为基础类型如下所示,而编码后的变为了字节类型(bytes) 但是两个函数的使用方法不变:

例如:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Sep  9 18:11:25 2018

@author: lilong
"""

u = '中文' #指定字符串类型对象u 
str00 = u.encode('gb2312')  # 以gb2312编码对u进行编码,获得bytes类型对象str 
u1 = str00.decode('gb2312') # 以gb2312编码对字符串str进行解码,获得字符串类型对象u1 
print('u1:',u1)

'''
#如果以utf-8的编码对str进行解码得到的结果,将无法还原原来的字符串内容
u2 = str00.decode('utf-8')
print('u2:',u2)
'''


import codecs 
import chardet

#必须事先知道文件的编码格式,这里文件编码是使用的utf-8 
f = codecs.open('text_1.txt','w+',encoding='utf-8')
#如果open时使用的encoding和文件本身的encoding不一致的话,那么这里将会产生错误 
f.write('显示成功!') 
f.close()
print('...........................')

## 文件的编码,这里必须是‘rb’即二进制读取
f = open('text_1.txt','rb')
data = f.read()
print(chardet.detect(data)) 
f.close()
# 读取文件内容,如果是不识别的encoding格式(识别的encoding类型跟使用的系统有关),这里将读取失败
f = codecs.open('text_1.txt','r+')
s = f.read() 
# 假设文件保存时以utf-8编码保存,以文件保存格式对内容进行解码,获得unicode字符串
u = s.encode('utf-8').decode('utf-8') 
print('u:',u)
f.close()
print('...........................')


f = open('corpus_1.txt','rb')
data = f.read()
print(chardet.detect(data))
f.close()


f = codecs.open('corpus_1.txt','r+')
# 如果是不识别的encoding格式(识别的encoding类型跟使用的系统有关),这里将读取失败
s = f.read()
# 假设文件保存时以utf-8编码保存,以文件保存格式对内容进行解码,获得unicode字符串
u = s.encode().decode('utf-8') 
print('u:',u)
# 下面我们就可以对内容进行各种编码的转换了
u1=u.encode('gb2312')
#print('u1:',u1)
print(u1.decode('gb2312'))
f.close()

结果:

u1: 中文
...........................
{'encoding': 'utf-8', 'confidence': 0.9690625, 'language': ''}
u: 显示成功!
...........................
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
u: <content>南都讯 记者刘凡 周昌和 任笑一 继推出日票后,深圳今后将设地铁VIP头等车厢,设坐票制。昨日,《南都METRO》创刊仪式暨2012年深港地铁圈高峰论坛上透露,在未来的11号线上将增加特色服务,满足不同消费层次的乘客的不同需求,如特设行李架的车厢和买双倍票可有座位坐的VIP车厢等。B厶成希深圳市政府副秘书长、轨道交通建设办公室主任赵鹏林透露,地铁未来的方向将分等级,满足不同层次的人的需求,提供不同层次的有针对的服务。其中包括一些档次稍微高一些的服务。“我们要让公共交通也能满足档次稍高一些的服务”。比如,尝试有座位的地铁票服务。尤其是一些远道而来的乘客,通过提供坐票服务,让乘坐地铁也能享受到非常舒适的体验。他说,这种坐票的服务有望在地铁3期上实行,将加挂2节车厢以实施花钱可买座位的服务。!拔颐窍M轨道交通和家里开的车一样,分很多种。”赵鹏林说,比如有些地铁是“观光线”,不仅沿途的风光非常好,还能凭一张票无数次上下,如同旅游时提供的“通票服务”。再比如,设立可以放大件行李的车厢,今后通过设专门可放大件行李的座位,避免像现在放行李不太方便的现象。“未来地铁初步不仅在干线上铺设,还会在支线、城际线上去建设。”!熬醯萌绻车费不太贵的话,还是愿意考虑的。”昨日市民黄小姐表示,尤其是从老街到机场这一段,老街站每次上下客都很多人,而如果赶上上下班高峰期,特别拥挤,要一路从老街站站到机场,40、50分钟还是挺吃力的,宁愿多花点钱也能稍微舒适一点。但是白领林先生则表示,自己每天上下班都要坐地铁,出双倍车资买坐票费用有点高。</content>
<content>南都讯 记者刘凡 周昌和 任笑一 继推出日票后,深圳今后将设地铁VIP头等车厢,设坐票制。昨日,《南都METRO》创刊仪式暨2012年深港地铁圈高峰论坛上透露,在未来的11号线上将增加特色服务,满足不同消费层次的乘客的不同需求,如特设行李架的车厢和买双倍票可有座位坐的VIP车厢等。B厶成希深圳市政府副秘书长、轨道交通建设办公室主任赵鹏林透露,地铁未来的方向将分等级,满足不同层次的人的需求,提供不同层次的有针对的服务。其中包括一些档次稍微高一些的服务。“我们要让公共交通也能满足档次稍高一些的服务”。比如,尝试有座位的地铁票服务。尤其是一些远道而来的乘客,通过提供坐票服务,让乘坐地铁也能享受到非常舒适的体验。他说,这种坐票的服务有望在地铁3期上实行,将加挂2节车厢以实施花钱可买座位的服务。!拔颐窍M轨道交通和家里开的车一样,分很多种。”赵鹏林说,比如有些地铁是“观光线”,不仅沿途的风光非常好,还能凭一张票无数次上下,如同旅游时提供的“通票服务”。再比如,设立可以放大件行李的车厢,今后通过设专门可放大件行李的座位,避免像现在放行李不太方便的现象。“未来地铁初步不仅在干线上铺设,还会在支线、城际线上去建设。”!熬醯萌绻车费不太贵的话,还是愿意考虑的。”昨日市民黄小姐表示,尤其是从老街到机场这一段,老街站每次上下客都很多人,而如果赶上上下班高峰期,特别拥挤,要一路从老街站站到机场,40、50分钟还是挺吃力的,宁愿多花点钱也能稍微舒适一点。但是白领林先生则表示,自己每天上下班都要坐地铁,出双倍车资买坐票费用有点高。</content>

Python2和Python3在字符串编码上的区别:

python2的这里就不再讲述了,直接看pyhton3的:

>>> '张俊' #python3的字符串默认为unicode格式(无编码)
'张俊'

>>> u'张俊' #由于默认为unicode格式,因此字符串不用像python2一样显式地指出其类型,否则是语法错误。
File "<stdin>", line 1
u'张俊'
^
SyntaxError: invalid syntax

>>> type('张俊') #python3中文本字符串和字节字符串是严格区分的,默认为unicode格式的文本字符串
<class 'str'>

>>> '张俊'.decode('utf-8') #因为默认的文本字符串为unicode格式,因此文本字符串没有decode方法
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode'

>>> '张俊'.encode('utf-8') #将文本字符串编码,转换为已编码的字节字符串类型
b'\xe5\xbc\xa0\xe4\xbf\x8a'

>>> type('张俊'.encode('utf-8'))
<class 'bytes'>

>>> print ('张俊'.encode('utf-8')) #对于已编码的字节字符串,文本字符串的许多特性和方法已经不能使用。
b'\xe5\xbc\xa0\xe4\xbf\x8a'

>>>print ('张俊'.encode('utf-8'))
b'\xe5\xbc\xa0\xe4\xbf\x8a'

>>> print ('张俊'.encode('utf-8').decode('utf-8'))  #必须将字节字符串解码后才能打印出来
张俊

参考:
https://www.cnblogs.com/geekard/archive/2012/10/04/python-string-endec.html

猜你喜欢

转载自blog.csdn.net/lilong117194/article/details/82563723