python—编码,文件练习题
1,编码问题
(1)请问python2与python3中的默认编码是什么?
python 2.x默认的字符编码是ASCII,默认的文件编码也是ASCII python 2.x默认的字符编码是unicode,默认的文件编码也是utf-8
(2)为什么会出现中文乱码,你能举例说明乱码的情况有哪几种?
无论以什么编码在内存里显示字符,存到硬盘上都是2进制,所以编码不对,程序就会出错了。 (ascii编码(美国),GBK编码(中国),shift_JIS编码(日本),,,,) 要注意的是,存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读,要不然就乱了。。 常见的编码错误的原因有: python解释器的默认编码 Terminal使用的编码 python源文件文件编码 操作系统的语言设置,掌握了编码之前的关系后,挨个排错就ok
(3)如何进行编码转换?
如果想要中国的软件可以正常的在美国人的电脑上实现,有下面两种方法:
1
,让美国人的电脑都装上gbk编码
2
,让你的软件编码以utf
-
8
编码
第一种方法不可现实,第二种方法比较简单,但是也只能针对新开发的软件,
如果你之前开发的软件就是以gbk的编码写的,上百万行代码已经写出去了,
重新编码成utf
-
8
格式也会费很大力气。
所以,针对已经用gbk开发的软件项目如何让项目在美国人的电脑上正常显示
还记得
unicode
的一个功能就是其包含了跟全球所有国家编码的映射关系,
所以无论你以什么编码存储的数据,只要我们的软件把数据从硬盘上读到内存,
转成
unicode
来显示即可,由于所有的系统,编程语言都默认支持
unicode
,
所有我们的gbk软件放在美国电脑上,加载到内存里面,变成了
unicode
,中文就可正常展示
(4)#_*_coding:utf-8_*_ 的作用是什么?
#_*_coding:utf-8 _*_ 的作用是.py文件是什么编码,就需要告诉python用什么编码去读取这个.py文件
(5)解释python2.x bytes与python3.x bytes的区别
简单点说:
Python
2
将 strings 处理为原生的 bytes 类型,而不是
unicode
,
Python
3
所有的 strings 均是
unicode
类型。
在python2.x中,写字符串,比如 >>>s = ”学习“ >>>print s 学习 >>>s '\xd1\xa7\xcf\xb0' 虽然说打印的是学习,但是直接调用的变量s,确实一个个16进制表示的二进制字节, 我们称这个为byte类型,即字节类型,它把8个二进制一组称为一个byte,用16进制表示 所以说python2.x的字符串其实更应该称为字符串,通过存储的方式就能看出来, 但是在python2.x中还有一个bytes类型,两个是否相同呢,回答是肯定的,在python2.x中,bytes==str python3.x中 把字符串变成了unicode,文件默认编码编程了utf-8,这意味着,只要用python3.x, 无论我们的程序以那种语言开发,都可以在全球各国电脑上正常显示。 python3.x除了把字符串的编码改成了unicode,还把str和bytes做了明确区分, str就是unicode格式的字符串bytes就是单纯的二进制 (补充一个问题,为什么在python3.x中,把unicode编码后,字符串就变成了bytes格式 ,为什么不直接打印成gbk的字符,我觉得就是想通过这样的方式明确的告诉你,想在python3.x中看字符, 必须是unicode,其他编码一律是bytes格式)
2,文件处理、
(1) r和rb的区别是什么?
文件操作时候,以“r"或者”rb"模式打开,只能读取,无法写入; 硬盘上保存的文件都是某种编码的0101010,打开时需要注意: rb,直接读取文件保存时原生的0101010,在Python中用字节类型表示 r和encoding,读取硬盘的0101010,并按照encoding指定的编码格式进行断句, 再将“断句”后的每一段0101010转换成unicode的 010101010101,在Python中用字符串类型表示
(2)解释一下下面三个参数的作用分别是什么?
open
(f_name,
'r'
,encoding
=
"utf-8"
)
f_name 是文件的路径,mode是打开的方式,encoding是编码格式 encoding #文件编码 mode #打开模式 name #文件名 newlines #文件中用到的换行模式,是一个tuple softspace #boolean型,一般为0,据说用于print
(3) w和wb的区别是什么?
文件操作时候,以 “w”或“wb” 模式打开,则只能写,并且在打开的同时会先将内容清空。 写入到硬盘上时,必须是某种编码的0101010,打开时需要注意: wb,写入时需要直接传入以某种编码的0100101,即:字节类型 w 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码 将unicode字符串转换为该编码的 010101010
(4)a和ab的区别是什么?
文件操作时,以 “a”或“ab” 模式打开,则只能追加,即:在原来内容的尾部追加内容 写入到硬盘上时,必须是某种编码的0101010,打开时需要注意: ab,写入时需要直接传入以某种编码的0100101,即:字节类型 a 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码 将unicode字符串转换为该编码的 010101010
(5)readline和readlines的区别
readline() #读取一行 readlines() #读取所有内容,并返回列表(一行为列表的一个元素值)
练习题1 —— 全局替换程序:
-
写一个脚本,允许用户按以下方式执行时,即可以对指定文件内容进行全局替换
`python your_script.py old_str new_str filename`
-
替换完毕后打印替换了多少处内容
练习题2 —— 模拟登陆:
- 用户输入帐号密码进行登陆
- 用户信息保存在文件内
- 用户密码输入错误三次后锁定用户,下次再登录,检测到是这个用户也登录不了
user_name = 'alex' password = 123 user_info = {} count = 0 f = open('saa.txt.new', 'r+', encoding='utf-8') file = f.read() f.close() print('请登陆'.center(30, '*')) while count < 3: name = input('请输入用户名 : ') key = input('请输入密码 : ') key = int(key) if name in file: print('你的用户被锁定了') break elif name not in file: if name == user_name and key == password: print('登陆成功'.center(30, '-')) f2 = open('saz.txt', 'w', encoding='utf-8') user_info[user_name] = password f2.write(str(user_info)) f2.close() break else: print('用户名或密码错误,请再试%s次' % (2-count)) count += 1 if count == 3: print('你的账户已被锁定'.center(30, '*')) f = open('saa.txt.new', 'r+', encoding='utf-8') file = f.write(name) f.close()