字符编码
为什么要有字符编码?
字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1".
一个文件用什么编码方式存储,就用什么编码打开
计算机在存取数据的时候,以什么格式存的就需要以什么格式来解码.例如:数据在内存中使用unicode编码来保存,当数据要刷入硬盘时,就需要把数据用utf-8的标准转换成Bytes(二进制),保存在硬盘上,读取的时候就需要用utf-8的标准转换成unicode,如果保存和读取使用的编码不同会导致乱码.
python3默认以utf-8的方式存:
内存中的编码,在未执行行前所有的都是unicode类型,但是在执行时候,会根据python设置的编码类型进行编码,默认utf-8,编码会另外开辟内存空间
python2:默认以ASCII编码读取,一般读取时候需要手动指定,否则代码无法正常运行。Python2中的 str默认存的是Bytes。而不是像Python3一样默认存的是unicode.
Python使用 encode和decode 两个参数命令来编码和解码.
encode是unicode编码的过程,可以转成任何编码,如utf-8,gbk等
decode是解码的过程,用什么方式编码就用什么方式解码
python文件执行的时候在哪个终端执行就用哪个终端的字符编码进行输出打印
乱码:存的时候乱码,无解
读乱码:选择正确的编码方式打开即可
python文件头:unicode按照头部声明的编码类型进行encode
#! /usr/bin/env python #linux指定python解释器,windows上无效 # -*- coding: utf-8 -*- #指定字符编码
文件处理
打开一个文件:文件名,权限,字符编码
权限分为三种:
r只读:读文件权限,没有这个文件将报错
w可写:如果文件存在,将清除该文件的所有内容再写,如果不存在将创建文件
a追加写:不清除文件内容的写权限,如果文件不存在,那么创建,存在则追加,打开后光标就在最后面
另外,rb、wb、ab是以Bytes读取文件,二进制模式不需要指定encoding字符编码
f=open('aa.txt','r',encoding='utf-8')
读文件
f.read() #一次读完,如果括号内加一个数字,就是读多少个字符,这种方式读取后,文件内的光标会到最后,再次read的时候将读不到任何内容 f.readline() #一次读取一行,每执行依次,光标将到达下一行开头 f.readlines() #列表方式读,一行为列表的其中一个元素,一次将文件读完
写文件
f.write('11111111 222 555 ') #写内容,需要有写权限打开文件,写的是字符串,没有换行操作,需要自己写 f.writelines(['111 ','444 ']) #列表方式写
关闭文件:文件操作完成需要关闭打开的文件
f.close()
其他操作:
f.flush() #写完立即向磁盘刷新 f.closed #判断文件是否关闭 print(f.name,f.encoding) print(f.readable()) #是否以只读 print(f.writable()) #是否可写 #seek结合二进制方式读 f.seek(2) #光标移动两个字节,默认以文件开始为参照 f.seek(2,1) #第二个数:0是文件开始,1表示当前位置,2为倒着 f.tell() #输出光标所在位置 f.truncate(3) #截断,写操作,将光标后的内容删除,以字节为单位
替换文件中的内容:前提是有aa.txt文件
import os f=open('aa.txt','r',encoding='utf-8') w=open('aa.txt.swp','a',encoding='utf-8') for line in f.readlines(): if 'wangyong' in line: line=line.replace('wangyong','jiazihe') w.write(line) else: print('aaa') f.close() w.close() os.remove('aa.txt') os.rename('aa.txt.swp','aa.txt')
上下文方式进行文件打开操作:这种方式不用close文件
with open('aa.txt','r',encoding='utf-8') as f_file, open('aa.txt.swp','w',encoding='utf-8') as w_file:
函数基础
函数是一种基本的代码抽象的方式。
函数是一种过程,也称为子程序,它执行一个指定的运算或操作.
函数的使用有两个过程,定义和调用。和现实生活中各类工具的使用一样,如剪刀、镊子等,要使用剪刀镊子,必须先创造剪刀和镊子。而函数即可了解成编程中的工具,事先准备工具的过程是定义函数,拿来就用指的就是函数调用
函数使用必须是:先定义,后调用
函数和变量的定义方式相似
定义阶段:同样跟变量一样,在内存中开辟空间存储,只检查语法上的错误
调用阶段:调用阶段才会报函数逻辑上的错误
如:
def tets(): #这个函数定义的时候并不会报错,语法没有问题,逻辑有问题,并且在调用函数时报错 alkajhsdlaksld #识别为变量名,定义的时候没问题,但是调用的时候找不到变量名报错 def test1(): #这个函数定义的时候会报错 ,因为是语法错误 if 1 > 2 print('123')
函数的分类
内置函数:built-in
如:max、print、len等打开python解释器就能够使用的函数
自定义函数:
def 函数名(参数1,参数2,...): '''注释''' 函数体
定义函数的函数名可以理解成变量名,调用函数时候需要用函数名进行调用,函数名的定义一般不要和内置函数或关键字冲突
参数是函数调用过程红需要传入的值
注释是说明该函数的作用,可以没有
函数体是该函数调用时候所执行的代码块
示例:打印字符的函数,函数调用的时候需要传入字符和数字,如下打印a 100次
def print_tag(tag,con): print(tag*con,end=' ') print_tag('a',100)
函数分类:
定义无参函数: 不依赖外部参数运行
def print_num() print('111111')
定义有参函数: 依赖外部参数运行
def print_tag(tag,con): print(tag*con,end=' ') print_tag('a',100)
定义空函数: 函数体为pass,主要用于一个程序框架的构建过程
def func_name(): '''说明''' pass
调用函数
语句形式:
print_num()
表达式形式:
res=print_num()
作为参数形式:
print(print_num())