每日一记
打开并读取文件
#不安全代码
f = open("h.txt",encoding="utf-8")
print(f.read())
print(1 / 0)
f.close()
#逻辑正确,但是代码冗余
f = open("h.txt",encoding="utf-8")
try:
print(f.read())
print(1 / 0)
except:
pass
finally:
f.close()
用with方法可以自动进行资源释放
with:资源释放
工作原理:
(1)紧跟with后面的语句被求值后,返回对象的"enter()"方法被调用,这个方法的返回值将被赋值给as后面的变量
(2)当with后面的代码块全部被执行完之后,将调用前面返回对象的"exit()"方法
class demo():
def __enter__(self):
print("进入enter方法")
return "你好"
def __exit__(self, exc_type, exc_val, exc_tb):
print("进入exit方法")
print("---",exc_type)
print("---",exc_val)
print("---",exc_tb)
def text():
return demo()
with text() as t:
print(t)
显示结果为:
进入enter方法
你好
进入exit方法
--- None
--- None
--- None
上述代码的执行过程:
enter()方法被执行—>enter()方法的返回值,“你好”,赋值给变量t,—>执行代码块,打印变量的值"你好"—>exit()方法被调用
【注:】exit()方法中有三个参数,exp_type,exc_val,exc_tb,这些参数在异常处理中非常有用。
exp_type:错误的类型
exp_val:错误类型对应的值
exc_tb:代码中错误发生的位置
总结:
实际上,在 with 后面的代码块抛出异常时,exit()方法被执行。开发库时,清理资源,关闭文件等操作,都可以放在 exit()方法中。总之,with-as 表达式极大的简化了每次写 finally 的工作,这对代码的优雅性是有极大帮助的。
用 fileinput 操作文件 ( 要先导入 fileinput 模块:import fileinput )
作用:fileinput 可以同时对一个或多个文件中的内容进行迭代,遍历等操作。该模块的 input() 方法有点类似文件的 readlines()方法,区别是前者只是迭代一个对象,每次只生成一行,而后者是一次性读取所有行,当遇到大文件时,无疑前者更有效率。
fileinput 的常用可选参数:
inplace:用于决定 print 输出到哪,若 inplace = 0,print 则输出到屏幕(即标准输出),若 inplace = 1,则把 print 结果写到文件,默认情况下 inplace = 0backup:指定备份文件的扩展名,如.bak,若备份文件存在,则覆盖
import fileinput
with fileinput.input("b.txt",mode="rb") as lines:
for line in lines:
print(line.decode("utf-8"))
利用 os 模块进行目录操作
Python 提供的 os 模块提供了很多对文件或目录进行操作的函数,可以方便地
对文件进行重命名,增加/删除目录,复制目录等操作
import os
#print(os.getcwd())#获取当前目录
#print(os.listdir())#获取文件目录下的所有文件和文件夹
#os.mkdir("e://new") #创建一个新的文件夹
#os.rmdir("new") #删除文件夹
#os.mkdir("new")
#print(os.path.isdir("new")) #判断是否是文件夹
#print(os.path.isfile("test.py")) #判断是否是文件
for i in os.walk("./"): #遍历一个文件夹里面的所有目录 # ./ 当前目录 ../ 当前目录的上一个目录 ../../
print(i)
#文件的遍历,用python写出源码(遍历一个文件夹里面的所有目录)
import os
def bf(path):
list = os.listdir(path)
for item in list:
if os.path.isfile(os.path.join(path,item)): #path+"/"+item
print(item)
else:
print(item)
bf(os.path.join(path,item))
序列化:
dumps和dump,load和loads的区别:
dumps是将对象序列化
dump是将对象序列化并保存到文件中
loads将序列化字符串反序列化
load将序列化字符串从文件读取并反序列化
Pickle 对象串行化:pickle模块将任意一个python对象转换成一系统字节的这个操作过程叫做串行化对象。
Pickle模块:
python持久化的存储数据:
import pickle
#将数据序列化后存储到文件中
f = open('test.txt','wb') #pickle只能以二进制格式存储数据到文件
data = {'k1':'python','k2':'java'}
f.write(pickle.dumps(data)) #dumps序列化源数据后写入文件
f.close()
#反序列化读取源数据
import pickle
f = open('test.txt','rb')
da = pickle.loads(f.read()) #使用loads反序列化
print(da)
json与pickle模块的区别
1、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。
2、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。
shelve模块
shelve与pickle类似用来持久化数据的,不过shelve是以键值对的形式,将内存中的数据通过文件持久化,值支持任何pickle支持的python数据格式,它会在目录下生成三个文件。