[Python2]文件操作_数据序列化_函数编程

文件操作,json与pickle序列化,函数编程

文件操作

  • 文件操作模式:r,只读模式(默认);w,只写模式(不可读;不存在则创建;存在则删除内容);a,追加模式(可读,不存在则创建,存在则只追加内容。)r+,读写模式(可读;可写;可追加);w+,写读模式(先创建文件,写入文件开始读)
  • 二进制读写模式:rb;wb;ab(二进制文件的读,写,追加模式)
  • 在打开读取文件时,文件内有个指向读取位置的指针,会随之移动到已经读到的位置处
  • 打开文件:f = open("yesterday",'r',encoding="utf-8")#r为指定模式为读取模式
  • 创建文件:f = open("yesterday",'w',encoding="utf-8")#在写模式下open为创建新文件
  • 文件追加:f= open("yesterday",'a',encoding="utf-8")#在追加模式打开文件
  • 可读可写可追加模式:f = open("yesterday",'r+',encoding="utf-8")#打开文件读写
  • 可读可写可追加模式:f = open("yesterday",'w+',encoding="utf-8")#创建文件写入读取
  • 为防止忘了关闭文件,可使用with语句:with open("yesterday",'r',encoding="utf-8") as f:#所有操作指令都在with下执行,当执行结束跳出with则自动关闭文件
  • 文件读取data = f.read()#在只写和追加模式下可用,read可填写读取的字符数
  • 文件读取一行:print(f.readlines())#读取文件的一行内容
  • 循环读取整个文件:
###这种方法将文件一次性读取成列表,放到内存中,不适合大文件
f = open("ZhenhuiZhang",'r', encoding="utf-8")
for line in f.readlines(): #一次性读取整个列表
    print(line)
f.close()
###这种方法将文件一行一行的读取,适合大文件,占用内存小
f = open("ZhenhuiZhang",'r', encoding="utf-8")
for line in f:#一行一行读取,迭代器方法
    print(line)
f.close()
  • 文件写入:f.write("write by zzh")#在写模式活追加模式下才可用
  • 文件关闭:f.close()#在文件操作完成后,务必记得关闭文件
  • 读取文件指针位置:print(f.tell())#文件指针位置,位置根据字符个数计数
  • 移动文件指针位置:f.seek(0)#移动到文件开头
  • 文件编码格式:print(f.encoding)#获取文件的编码格式
  • 将内存中的缓存写入硬盘文件f.flush()#强制刷新
  • 文件截断f.truncate(25)#从文件指针位置往后截断到25个字符处

序列化与反序列化

json数据序列化

  • 在编写程序过程中,当我想要对一个数据进行临时的存储,并且在未来的一个时刻将数据进行恢复,即将目标数据以文件形式进行存储,可使用json序列化
  • json序列化也可用于不同语言之间的数据交互,将数据用A语言json序列化,再用B语言json反序列化。目前json已经取代xml成为主流的程序间交互数据的方式。
  • json只能够处理简单的数据类型,而无法处理复杂的数据(如函数)
  • json序列化:
import json
info = {"name": 'zzh' , "age": 23}
f = open("test.test", "w")
f.write(json.dumps(info))
f.close()
  • json反序列化:
f =open("test.test","r")
info = json.loads(f.read())
print(info)
f.close()

pickle数据序列化

  • 若要以文件存储复杂的内容,则可以采用pickle,其用法与json较为类似
  • 但是pickle只能在python中可以使用
  • pickle序列化:
import pickle
def sayhi(name):
    print('hello',name)
info = {"name": 'zzh',"age": 23,"func":sayhi}
f = open("test.test", "wb")##注意这里是二进制的写
f.write(pickle.dumps(info))
f.close()
###或者也可以等效成下面###
f = open("test.test", "wb")##注意这里是二进制的写
pickle.dump(info,f)
f.close()
  • pickle反序列化:
f =open("test.test","rb")##注意这里是二进制的读
info = pickle.loads(f.read())
print(info)
f.close()
###或者也可以等效成下面###
f =open("test.test","rb")##注意这里是二进制的读
info = pickle.load(f)
print(info)
f.close()

3.函数式编程

  • 常见的编程方式有:面向对象(class),面向过程(def),函数式编程(def)
  • 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
  • 形参与实参:形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
  • 在函数内部若想修改全局变量,则需要声明global zzh #zzh为全局变量名,但是强烈不推荐使用
  • 当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
  • 函数的参数与返回值:
def calc(x,y):
    res = x**y
    return res #返回函数执行结果
c = calc(a,b) #结果赋值给c变量
print(c)
  • 函数的默认参数:可以在定义函数时,给予默认参数;调用时若用户未指定则使用默认参数。如:def calc(x=1,y=2):
  • 非固定参数:若函数传入的参数数量不固定,可使用非固定参数。
    *args方法:接收N个位置参数,将其转化为元组,如:def stu_info(name,age,*args): # *args 会把多传入的参数变成一个元组形式。
    **kwargs方法:接收N个关键字参数,将其转化为字典,如:
def stu_register(name,age,*args,**kwargs): # **kwargs 会把多传入的参数变成一个字典
    print(name,age,args,kwargs)
stu_register("ZZH",23,"CN","Python",sex="Male",province="FuJian")
#输出  :  ZZH 23 ('CN', 'Python') {'province': 'FuJian', 'sex': 'Male'}
  • 参数放置顺序:位置参数, 关键字参数,默认值参数,参数组*args,参数组**kwargs
  • 函数递归:如果一个函数在内部调用自身本身,这个函数就是递归函数。
  • 递归特性:1. 必须有一个明确的结束条件;2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少;3. 递归效率不高,递归层次过多会导致栈溢出
  • 匿名函数:calc = lambda x:x*3#lambda为匿名函数关键字
  • 高阶函数:一个函数就可以接收一个函数作为参数,或者一个函数的返回结果是一个函数,则称这种函数就称之为高阶函数。
def add(a,b,func):
    return func(a)+func(b)
res = add(3,-6,abs)
print(res)
#输出:9

参考:
https://www.cnblogs.com/alex3714/articles/5740985.html
http://www.cnblogs.com/alex3714/articles/5161349.html