day16笔记 文件(csv)读写拷贝,序列化反序列化

作业讲解

#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()
枚举类型是一个有限的取值集合,可以通过序列化反序列化将其转换为字符串或数字。 序列化:将枚举类型转换为字符串或数字,以便于存储或传输。在C#中,可以使用Enum.ToString()方法将枚举转换为字符串,也可以使用(Enum)枚举值将枚举转换为整数。 反序列化:将字符串或数字转换为枚举类型。在C#中,可以使用Enum.Parse()方法将字符串转换为枚举类型,也可以使用(Enum)整数将整数转换为枚举类型。 以下是一个示例代码: ```csharp using System; enum DayOfWeek { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } class Program { static void Main(string[] args) { // 序列化 DayOfWeek day = DayOfWeek.Monday; string dayStr = day.ToString(); int dayInt = (int)day; Console.WriteLine($"dayStr: {dayStr}"); Console.WriteLine($"dayInt: {dayInt}"); // 反序列化 string dayStr2 = "Wednesday"; DayOfWeek day2 = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), dayStr2); int dayInt2 = 5; DayOfWeek day3 = (DayOfWeek)dayInt2; Console.WriteLine($"day2: {day2}"); Console.WriteLine($"day3: {day3}"); } } ``` 输出结果: ``` dayStr: Monday dayInt: 1 day2: Wednesday day3: Friday ``` 在上面的示例中,我们首先将枚举类型`DayOfWeek`的值序列化为字符串和整数,然后将其反序列化为枚举类型的值。注意,反序列化时需要使用`Enum.Parse()`方法将字符串转换为枚举类型,或者使用强制类型转换将整数转换为枚举类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值