Python基础day-5[字符编码,文件处理,函数(未完)]

字符编码:

  为什么要有字符编码?字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1".

  字符编码其实就是在完成一件,字符====>数字的翻译过程.

  ASCII:

  最早计算机是美国发明的,所以最早诞生的ASCII码也是基于英文考虑的.ASCII码:一个Bytes代表一个字符,1Bytes=bit.最早的ASCII只用到后七位.

127个数字,已经完全能代表键盘了,后来又把127号之后的空位来表示新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128 到255这一页的字符集被称”扩展字符集“。

  GBK标准:

  等到中国使用计算机的时候,已经没有可利用的字节状态来表示汉字了,所以中国人发明了GBK标准,一个字符等于两个Bytes.GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK扩成了 GB18030。这一系列汉字编码的标准叫做 “DBCS“(Double Byte Charecter Set 双字节字符集).

  UNICODE:

  由于各国都有自己的一套像中国一样的编码标准,互相之间又看不懂对方的编码.所以ISO(国际标准化组织)制定了一种新的编码”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“.unicode规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原 来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种方案在保存英文文本时会多浪费一倍的空间.

  UTF-8

  UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes.

补充:

  计算机内存中使用的编码是unicode,用空间来换取时间,而硬盘或者网络传输则使用的是utf-8,来达到节省空间的目的.

  计算机在存取数据的时候,以什么格式存的就需要以什么格式来解码.例如:数据在内存中使用unicode编码来保存,当数据要刷入硬盘时,就需要把数据用utf-8的标准转换成Bytes(二进制),保存在硬盘上,读取的时候就需要用utf-8的标准转换成unicode,如果保存和读取使用的编码不同会导致乱码.

  python中的字符编码:

  当我们在写一个Python文件的时候,这时候写的东西其实就是字符串,跟Python的命令没有任何关系,Python是一种解释语言,当我们用Python解释器去运行我们写的代码时,解释器会按照代码头声明的字符编码,先去硬盘读取数据,使用声明的字符编码解码转换成unicode编码,然后在解释执行.

  python3三中,默认使用的编码是unicode编码,Python2中则需要手动指定,否则代码无法正常运行.Python2中的 str默认存的是Bytes.而不是像Python3一样默认存的是unicode.

  Python使用 encode和decode 两个参数命令来编码和解码.

文件处理:

  打开文件:
  f = open('a.txt','w',encoding='utf-8')

  #encoding 定义文件的读取方式 w表示覆盖写入打开,a是追加写入文件内容,  r是只读模式
  #rb,wb,ab 以Bytes读取文件,二进制模式 不需要指定encoding
  

  f.write('安居客活动卡收到类似的看了\n3213213213213213\n')

  #写入字符串 无自动换行 需加\n    #同read Bytes模式

 

  f = open('a.txt',encoding='utf-8')
  print(f.read()) #读取文件所有内容,并打印出来 ()内写数字,根据字符来确定光标位置
  #当以Bytes方式读取文件时,需要指定 encoding来正常显示

 

  #关闭打开的文件
  f.close()

  #立即刷入写入内容
  f.flush()

  #判断文件是否关闭
  f.closed

  #查看文件名和字符编码
  f.name,f.encoding

  #移动光标
  f.seek(0) #以文件起始作为参考,()内是字节来移动 (3,0/1/2) 0/1/2 分别代表 文件起始/当前位置/文件末尾

  #告知当前光标位置
  f.tell()

  #截断(写操作) ()也是字节来判断
  f.truncate()

小练习:
用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作
def replace_str(fname,a,b): #定义三个传入参数 import os #导入os模块 if os.path.exists(fname): #判断文件是否存在 fp = open(fname,'r')   #以只读模式打开用户输入的文件 ft = open('tmp','w') #以读写模式打开一个文件,不存在则自动创建 for line in fp: #for循环,一行一行取出用户输入文件的的所有内容 if a in line: #判断用户输入的 a参数,是否存在 line=line.replace(a,b) #修改并赋值 ft.write(line) #如果存在就把修改的内容写入文件 else: ft.write(line) #如果不存就把读取的内容重新写入新文件 fp.close() #关闭用户输入的文件 ft.close()  #关闭新建的临时文件 os.remove(fname) #删除用户输入的文件 os.rename('tmp',fname) #把临时文件重命名为 用户输入的文件名 return #跳出函数 replace_str(r'E:\Python\Exercise\test.txt','abc','ABC') #调用函数 文件路径前面的 r是转义符,因为Windows使用的右斜杠所以需要转义 也可以输入两个 右斜杠\\依次转义

 

函数:

  一 为何要有函数?
    不加区分地将所有功能的代码垒到一起,问题是:
    代码可读性差
    代码冗余
    代码可扩展差

  如何解决?
    函数即工具,事先准备工具的过程是定义函数,拿来就用指的就是函数调用

  结论:函数使用必须是:先定义,后调用

 

  二:函数的分类
  1.内置函数:built-in
  2.自定义函数:
    def 函数名(参数1,参数2,...):
    '''注释'''
    函数体

  示例:

    def a(t,c,h):     #传入三个参数,定义t:打印什么,c打印多少次,h打印几行
    for i in range(h):    #for循环,循环为h的次数
    print(t*c)  #打印内容t 和次数

  定义函数分类  

    定义无参函数: 不依赖外部参数运行
    def print()
    print('111111')
    定义有参函数: 依赖外部参数运行
    def a(t,c,h):
    for i in range(h):
    print(t*c)
    定义空函数: 函数体为pass
    def <函数名>(x,y,z)
    pass

  调用函数的形式:

    语句形式:

      func()

    表达式形式:

      res=func()

    作为参数形式:

      print(func(10))

  函数分为定义阶段和调用阶段:

    函数和变量的定义方式相似

    定义阶段:同样跟变量一样,在内存中开辟空间存储,只检查语法上的错误

    调用阶段:调用阶段才会报函数的错误

def tets():         #这个函数定义的时候并不会报错,语法没有问题,逻辑有问题,并且在调用函数时报错
    alkajhsdlaksld     #识别为变量名,定义的时候没问题,但是调用的时候找不到变量名报错


def test1():    #这个函数定义的时候会报错 ,因为是语法错误
    if 1 > 2
        print('123')

 

posted @ 2017-06-13 01:00  neuropathy_ldsly  阅读(149)  评论(0)    收藏  举报