文件操作 字符编码
文件操作
对文件操作流程
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
打开文件的模式有:
- r,只读模式(默认)。
- w,只写模式。【不可读;不存在则创建;存在则删除内容;】
- a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+,可读写文件。【可读;可写;可追加】
- w+,写读
- a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
- wb
- ab
常用的文件处理方法
1 f=open('yesterday','r',encoding='utf-8') 2 #读一行 3 print(f.readline()) 4 #读取剩余的内容 5 print(f.read())#从第二行开始读取 6 print(f.readline(10)) #表示读一行中的前十个字符 7 #将文件内容以列表形式存储,每一行作为一个元素 8 list=print(f.readlines()) 9 #打印指针当前位置 10 print(f.tell()) 11 #光标回到的位置,括号内不能为空 12 f.seek(0) 13 #刷新内容 14 f.flush() 15 #截取,括号内为空,清空整个文件,有,从头开始截取多少个字符 16 f.truncate(50) 17 #strip去掉换行,空格等, 18 for line in f: 19 print(line.strip()) 20 f.encoding #打印文件格式 21 f.fileno() #返回文件句柄编号 22 f.readable() #判断文件是否可读 23 f.close() #关闭文件
with
1 import os 2 with open('day','r',encoding='utf-8') as f,\ 3 open('day1','w+',encoding='utf-8') as f1: 4 for i in f: 5 if '如今回想起的所有对话'in i: 6 i=i.replace("如今回想起的所有对话","现在回想起的所有场景") 7 f1.write(i) 8 9 #两个文件互换 10 os.rename('day1','day_bak') 11 os.rename('day','day1') 12 os.rename('day_bak','day') 13 #删除文件 14 os.remove('day1')
字符编码与转码
需知:
1.在python2默认编码是ASCII, python3里默认是unicode
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
4.utf-8:英文一个字节,欧洲两个字节,中文三个字节
1 #-*-coding:gb2312 -*- #这个也可以去掉 2 __author__ = 'Alex Li' 3 4 import sys 5 print(sys.getdefaultencoding()) 6 7 8 msg = "我爱北京天安门" 9 #msg_gb2312 = msg.decode("utf-8").encode("gb2312") 10 msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔 11 gb2312_to_unicode = msg_gb2312.decode("gb2312") 12 gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8") 13 14 print(msg) 15 print(msg_gb2312) 16 print(gb2312_to_unicode) 17 print(gb2312_to_utf8) 18 19 in python3
字符串和二进制的转换
函数
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
特性:
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
语法定义
1 def add():#函数名 2 3 print("Hello!") 4 5 sayhi() #调用函数
有返回值和带参数形式
1 def add(x,y): 2 z=x+y 3 return z 4 print(add(1,4))
函数参数与局部变量
形参变量:
只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参:
可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
默认参数
def stu_register(name,age,course,country="CN"): #‘CN’即为默认参数,这样,这个参数在调用时不指定,那默认就是CN,指定了的话,就用你指定的值
关键参数
正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。
stu_register(age
=
22
,name
=
'alex'
,course
=
"python"
,)
位置参数
1 def add(x,y): 2 z=x+y 3 return z 4 add(1,4) #安照形式参数的位置,实际参数和形式参数位置一一对应
非固定参数
若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数
1 def stu_register(name,age,*args): # *args 会把多传入的参数变成一个元组形式 2 print(name,age,args) 3 4 stu_register("Alex",22) 5 #输出 6 #Alex 22 () #后面这个()就是args,只是因为没传值,所以为空 7 8 stu_register("Jack",32,"CN","Python") 9 #输出 10 # Jack 32 ('CN', 'Python')
还可以有一个**kwargs --------字典形式
1 def stu_register(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式 2 print(name,age,args,kwargs) 3 4 stu_register("Alex",22) 5 #输出 6 #Alex 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空 7 8 stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong") 9 #输出 10 # Jack 32 ('CN', 'Python') {'province': 'ShanDong', 'sex': 'Male'}
全局与局部变量
返回值
要想获取函数的执行结果,就可以用return语句把结果返回
注意:
- 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
- 如果未在函数中指定return,那这个函数的返回值为None
嵌套函数
在一个函数内再定义一个或多个函数
1 name = "Alex" 2 3 def change_name(): 4 name = "Alex2" 5 6 def change_name2(): 7 name = "Alex3" 8 print("第3层打印",name) 9 10 change_name2() #调用内层函数 11 print("第2层打印",name) 12 13 14 change_name() 15 print("最外层打印",name)
递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数
def calc(n): print(n) if int(n/2) ==0: return n return calc(int(n/2)) calc(10)
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)