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的区别

简单点说:

Python2将 strings 处理为原生的 bytes 类型,而不是unicode

Python3所有的 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()