作业讲解
#1.写一个计算器工具类Calculator,可以进行加、减、乘、除计算 #注意1:工具类:使用过程以简便为主,可以直接使用类名调用函数:类方法【cls】和静态方法 class Calculator(object): @staticmethod def add(x,y): return x + y @staticmethod def sub(x, y): return x - y @staticmethod def mul(x, y): return x * y @staticmethod def div(x, y): return x / y #注意2:__name__的作用:判断正在run的文件是否是当前文件 #如果运行的是当前文件,则结果为__main__,如果不是,则结果为模块名 #print(__name__) #import test #注意3:书写一个模块,如果某些代码在其他模块中不想被执行,则可以书写到if语句中【屏蔽】 if __name__ == "__main__": v1 = Calculator.add(3,4) print("和:",v1)
""" 2.创建一个Person类,添加一个类字段用来统计Perosn类的对象的个数 思路提示:要找到对象创建的方法 在该方法中统计对象的个数 """ #a. class Person(object): #定义一个类属性,用于统计创建的对象的个数,将其私有化 __count = 0 #只要创建对象,肯定和构造函数有关:__new__ __init__ def __new__(cls, *args, **kwargs): #类名.类属性 cls.__count += 1 return object.__new__(cls) def __init__(self): print("初始化") @classmethod def getcount(cls): return cls.__count p1 = Person() p2 = Person() p3 = Person() p4 = Person() print(Person.getcount()) print('=' * 30) #b class Person(object): count = 0 #注意:构造函数实际上也是成员函数,其他用法和之前的用法完全相同 @classmethod def __init__(cls,name,age): cls.count += 1 # cls.name = name # cls.age = age # p1 = Person() # p2 = Person() # p3 = Person() # p4 = Person() # p5 = Person() p6 = Person("张三",10) #print(p6.name,p6.age) print(Person.count)
一、常用文件读写
1.概念
如果想用word编写一份简历,应该有哪些流程呢?
- 打开word软件,新建一个word文件
- 写入个人简历信息
- 保存文件
- 关闭word软件
同样,在操作文件的整体过程与使用word编写一份简历的过程是很相似的
- 打开文件,或者新建立一个文件
- 读/写数据
- 关闭文件
Python内置了读写文件的函数,用法和C是兼容的
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象【通常称为文件描述符】,然后,通过操作系统提供的接口从这个文件对象中读取数据【读文件】,或者把数据写入这个文件对象【写文件】
2.读取文件
a.打开文件:open()方法
b.读取文件内容:read()方法
c.关闭文件:close()方法
注意:文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
#普通文件的读取 #1.打开 f1 = open(r"致橡树.txt","r",encoding="gbk") #f1 = open(r"file1.txt","r",encoding="utf-8") #FileNotFoundError: [Errno 2] No such file or directory: 'file1.txt' #f1 = open(r"aaa/bbb/ccc/file1.txt","r",encoding="utf-8") """ 说明: 1.路径 a.默认的参照路径是当前工程的根目录 b.尽量使用相对路径 c.如果文件路径不存在,则会出现异常FileNotFoundError 2.打开方式 r:read b:binary r:只读,文件描述符出现在文件的开头 rb:以二进制的形式打开一个文件用于只读,文件描述符出现在文件的开头,一般用于非文本文件,比如图片,音视频等 r+:读写,文件描述符出现在文件的开头 rb+:以二进制的形式打开一个文件用于读写,文件描述符出现在文件的开头,一般用于非文本文件,比如图片,音视频等 3.编码格式 a.常用utf-8和gbk b.设置encoding的时候,根据文本本身的编码格式书写,不要省略encoding="xxx" """ #2.读取内容 #a.read() 默认读取文件中的全部内容 # r1 = f1.read() # print(r1) #b.read(value) 读取文件中的指定字节的内容 # r1 = f1.read(4) # # print(r1) # # r1 = f1.read(4) # # print(r1) # # r1 = f1.read(4) # # print(r1) #c.readline(),读取一行内容,是以换行符或者回车作为判断的依据 # r1 = f1.readline() # print(r1) # r1 = f1.readline() # print(r1) # r1 = f1.readline() # print(r1) #d.readlines(),返回一个列表,每一行内容都是列表中的一个元素,同时包含\n r1 = f1.readlines() print(r1) """ 不同读取函数的使用场景: a.如果文件内容较少,直接使用read() b.如果文件内容较多,建议分批读取,直接使用read(value) c.如果文件内容呈现行的形式,并且要对行进行处理,则使用readline()或者readlines() """ #3.关闭 """ 为了避免内存空间的浪费,当文件被操作完成之后,最后将文件关闭 """ f1.close()
#使用read或者readline循环读取文件内容 import os #1.read(value) # path1 = r"致橡树.txt" # # f1 = open(path1,"r",encoding="gbk") # # #获取文件内容的总大小 # size = os.path.getsize(path1) # # subsize = 10 # # #循环读取文件 # while size >= 0: # r1 = f1.read(subsize) # print(r1) # # size -= subsize # # f1.close() #2.readline(),判断返回值是否为空【""】 path1 = r"致橡树.txt" f1 = open(path1,"r",encoding="gbk") r1 = f1.readline() print(r1) while r1: r1 = f1.readline() print(r1) f1.close()
3.写入文件
a.打开文件
b.将信息写入缓存
c.刷新文件内部缓冲
d.关闭文件
#1.打开 f2 = open("text1.txt","a",encoding="utf-8") """ 说明: 1.路径 a.在写入的时候,文件可以不存在,当写入的时候可以自动创建 但是,如果是读取,必须文件先存在,然后才能读取【FileNotFoundError】 2.打开方式 w:write b:binary a:append w:打开一个文件用于写入,文件描述符出现在文件的开头,会出现文件内容的覆盖 wb:打开一个二进制文件用于写入,文件描述符出现在文件的开头 w+ wb+ a:打开一个文件用于写入,文件描述符出现在文件的开头,会将新的内容追加到旧的内容的会面 a+ """ #2.写入 f2.write("致橡树是一首现代诗") #刷新缓冲区,为了加速数据的流动,保证缓冲区的畅通 f2.flush() #print(file=xxx,flush=True) #3.关闭 f2.close()
3.with管理上下文
""" with open() as 变量: 读取/写入 with语句实质上是一个上下文管理器,进行文件读写的时候,最后不需要手动关闭文件 """ #1.read with open(r"致橡树.txt","r",encoding="gbk") as f1: r1 = f1.read() print(r1) #2.write with open(r"text1.txt","w",encoding="utf-8") as f2: f2.write("hello")
4.非文本文件读写
#非文本文件:图片,音视频等 #1.read() """ 说明: a.读取的文件是非文本文件,所以打开的方式为rb b.如果打开文件的方式为rb/wb,则必须省略encoding 【ValueError: binary mode doesn't take an encoding argument】 c。读取文本文件,最后的返回值为字符串,如果读取的非文本文件,最后的返回值为字节 """ f1 = open(r"yangyang.jpg","rb") r1 = f1.read() print(r1) print(type(r1)) f1.close() #2.write() f2 = open(r"image.jpg","wb") #注意:如果采用wb的方式打开文件,进行write的时候需要的是bytes,不再是str f2.write(r1) f2.close()
4.文件拷贝
#需求:封装函数,实现文件内容的拷贝 import os def my_copy(src_path,des_path): """ 实现文件内容的拷贝 :param src_path: 源文件的路径,必须存在 :param des_path: 目标文件的路径,可以不存在,会自动创建 :return: None """ #判断源文件是否存在 if not os.path.exists(src_path): print("源路径不存在,无法拷贝") return if os.path.isdir(src_path): print("原路径是一个目录,无法拷贝") return #打开文件 src_file = open(src_path,"rb") des_file = open(des_path,"wb") #边读取边写入 size = os.path.getsize(src_path) subsize = 1024 while size > 0: #读 content = src_file.read(subsize) #写 des_file.write(content) des_file.flush() size -= subsize #关闭 src_file.close() des_file.close() if __name__ == "__main__": my_copy(r"致橡树.txt","new.txt")
二、csv文件读写
1.概念
CSV(Comma Separated Values逗号分隔值)
.csv是一种文件格式(如.txt、.doc等),也可理解.csv文件就是一种特殊格式的纯文本文件。即是一组字符序列,字符之间用英文字符的逗号或制表符(Tab)分隔
所以,CSV文件本身就是是个纯文本文件,这种文件格式经常用来作为不同程序之间的数据交互的格式
在windows系统环境上.csv文件打开方式有多种,如记事本、excel、Notepad++等,只要是文本编辑器都能正确打开
2.读取文件
import csv #1.三步曲 def readcsvfile1(path): #1.打开文件 f1 = open(path,"r",encoding="utf-8") #2.读取 r1 = csv.reader(f1) #使用csv.reader()返回一个可迭代对象,其中的元素是列表 #r1 = f1.read() #使用read直接读取,会将文件中内容原样输出 print(r1) #<_csv.reader object at 0x100c69ac8> #r1是一个可迭代对象,通过遍历获取其中的数据 for data in r1: print(data) #3.关闭 f1.close() #2.with def readcsvfile2(path): #注意:设定encoding的时候还是一句源文件的编码格式 with open(path,"r",encoding="gbk") as f2: r2 = csv.reader(f2) for row in r2: print(row) if __name__ == "__main__": readcsvfile1(r"a1.csv") readcsvfile2(r"a1.csv")
3.写入文件
import csv #1.三步曲 def writecsvfile1(path): #打开 f1 = open(path,"w",encoding="utf-8") #写入,csv.writer(fileobj)返回了一个空的可迭代对象 w = csv.writer(f1) print(w) #f1.write("xxxx") #注意:w.writerow(iterable)只能写入可迭代对象 #w.writerow(10) #_csv.Error: iterable expected, not int #w.writerow("hello") #w.writerow(["aaaa",10,True,"hello"]) infolist = [["aa",'b','c'],['1','2','3'],[45,6,6],[6,7,19]] for sublist in infolist: #注意:调用writerow的时候,如果重复调用,则会自动换行 w.writerow(sublist) #关闭 f1.close() #2.with def writecsvfile2(path): with open(path,"w",encoding="utf-8") as f1: w = csv.writer(f1) w.writerow(["aaaa", 10, True, "hello"]) if __name__ == "__main__": writecsvfile1("b1.csv")
三、对象序列化和反序列化【对象读写】
可以进行序列化和反序列化的模块是pickle和json
序列化:将对象持久化到磁盘上【写:write】
反序列化:将本地磁盘上的对象读取出来【读:read】
1.pickle模块
import pickle class Person(object): def __init__(self,name,age): self.name = name self.age = age def show(self): print("姓名:%s,年龄:%d" % (self.name,self.age)) p1 = Person("张三",20) print(p1) #1.要讲一个对象书写到磁盘上,普通的方式不行 #write(x),x可以是字符串或者字节 # file1 = open(r"per.txt","w",encoding="utf-8") #file1 = open(r"per.txt","wb") #file1.write(p1) #TypeError: write() argument must be str, not Person #TypeError: a bytes-like object is required, not 'Person' #file1.close() #2.pickle模块 #a.序列化【写入】 """ pickle.dump(obj,file) obj:将要被写入到磁盘的对象,obj可以是任意类型的数据 file:打开文件对象,注意:file必须以二进制的方式打开,使用wb """ file1 = open(r"per.txt","wb") pickle.dump(p1,file1) #write() file1.close() #b.反序列化【读取】 """ pickle.load(file),返回读取到的对象 file:打开文件对象,注意:file必须以二进制的方式打开,使用rb """ file2 = open(r"per.txt","rb") result = pickle.load(file2) #read() file2.close() #print(result) result.show() #姓名:张三,年龄:20
2.json模块
"""
JSON:JavaScript Object Notation,
因为json文件是一个纯文本文件,用于跨平台跨语言的进行数据交换
JSON和Python数据类型的对应:
Python JSON
dict object对象
list array数组
str string
int、float number
True、False true、false
None null
"""
import json
#1.序列化
"""
json.dumps(字典)将Python字典对象转换成json格式的字符串
"""
dict1 = dict(name='bob',age=10,score=100)
print(dict1,type(dict1))
r1 = json.dumps(dict1)
print(r1,type(r1))
"""
{'name': 'bob', 'age': 10, 'score': 100} <class 'dict'>
{"name": "bob", "age": 10, "score": 100} <class 'str'>
"""
#2.反序列化
"""
json.loads(json字符串),将json格式的字符串反序列化为Python中的字典对象
"""
str1 = '{"name": "bob", "age": 10, "score": 100}'
print(str1,type(str1))
r2 = json.loads(str1)
print(r2,type(r2))
import json
#1.序列化
"""
json.dump(obj,file)将Python字典对象序列化到本地磁盘上
"""
def func1():
dict1 = {
"name": "中国",
"province": [{
"name": "黑龙江",
"cities": {
"city": ["哈尔滨", "大庆"]
}
}, {
"name": "广东",
"cities": {
"city": ["广州", "深圳", "珠海"]
}
}, {
"name": "台湾",
"cities": {
"city": ["台北", "高雄"]
}
}, {
"name": "新疆",
"cities": {
"city": ["乌鲁木齐"]
}
}]
}
with open(r"data.json","w",encoding="utf-8") as f:
json.dump(dict1,f)
#2.反序列化
"""
json.load(file),将本地磁盘上的对象反序列化
"""
def func2():
with open(r"data.json","r",encoding="utf-8") as f:
r = json.load(f)
print(r)
print(type(r))
if __name__ == "__main__":
#func1()
func2()