5-1如何读写文本文件

python2中,默认编码是unicode编码,这种编码不能直接存储物理硬件(磁盘的扇区、网络的socket)中,需要转换成string(由连续的字节组成)

>>> s = '你好'
>>> s
'\xc4\xe3\xba\xc3'
>>> s.encode('utf8')

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    s.encode('utf8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
>>> s.encode('gbk')

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    s.encode('gbk')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)

从错误提示可以看出,字符串s不是unicode编码是而是ascii编码,不能再进行编码。

创建unicode编码字符串 在字符串前加’u’

>>> s1 = u'你好'
>>> s1
u'\u4f60\u597d'    #通过结果可以看出这是一个unicode编码字符串因为格式为u’xxxx’

unicode字符串进行编码(编码格式 分别为utf8和gbk)得到了string字符串(由连续的字节组成)

>>> s1.encode('utf8')
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> s1.encode('gbk')
'\xc4\xe3\xba\xc3'

python中只使用内部的unicode表示字符,编解码要使用统一格式 ,否则会乱码

>>> s2 = s1.encode('utf8')
>>> s2
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> s2.decode('utf8')
u'\u4f60\u597d'
>>> print(s2.decode('utf8'))
你好
>>> s2.decode('gbk')
u'\u6d63\u72b2\u30bd'
>>> print(s2.decode('gbk'))
浣犲ソ

Py2中写入文件时要把unicode编码格式编码,从文件读出后,也要把读出的按统一格式解码。

Py2文件读写:

>>> f = open('py2io.txt','w')
>>> s = u'你好'
>>> f.write(s.encode('gbk'))
>>> f.close()

>>> f = open('py2io.txt','r')
>>> t = f.read()
>>> f.close()
>>> t
'\xc4\xe3\xba\xc3'
>>> t.decode('gbk')
u'\u4f60\u597d'
>>> print t.decode('gbk')
你好
>>> f = open('py2io.txt','w')
>>> s = '你好'
>>> f.write(s)
>>> f.close()
>>> 
>>> f = open('py2io.txt','r')
>>> t = f.read()
>>> f.close()
>>> t
'\xc4\xe3\xba\xc3'
>>> print t
你好
>>> 

py3中 py2的str变成了byte,unicode变成了str(真正意义上的连续字符串),在py3 表示byte需要在字符串前加个b

py2中需要加个u''表示unicode字符串,而py3中默认就是unicode(也就是str),不需要添加。

py3中open函数功能更强大,可以使用encoding指定编码格式

Py3文件读写:

info = '你好'#open通过encoding参数自动编码成utf8
with open('H3','wt',encoding='utf8') as f:
    f.write(info)
#读取文件的时候,自动解码成utf8,不要和上面存入时的编码搞混,文件里的数据显示的是连续的字节
with open('H3','rt',encoding='utf8') as f2:
print(f2.read())

open打开方式中的‘wt’’rt’中的’t’是默认方式,不写也按此方式打开(文本模式)

 

猜你喜欢

转载自www.cnblogs.com/smulngy/p/8888195.html