一.文件操作
.close()作用:关闭流,防止流阻塞。(一定要写!!!)
#1.不安全代码,理由:close()方法可能失效,关闭不上
f = open(""gj.txt",encoding="utf-8")
print(f.read())
print(1/0)
f.close()
#2.逻辑正确,但是代码出现冗余
my = open("gj.txt",encoding="utf-8")
try:
print(my.read())
print(1/0)
except:
pass
finally:
my.close()
#3.等价于#2.
with open("gj.txt",encoding="utf-8") as my:
print(my.read())
print(1/0)
二.with:
1.作用:资源释放(如:文件使用后会自动关闭;线程中锁的自动获取和释放等。)
2.工作原理:
(1)紧跟with后面的语句被求值后,返回对象的" __ enter __ () “方法被调用,这个方法的返回值将被赋值给as后面的变量。
(2)当with后面的代码块全部被执行完后,将调用前面返回对象的” __ exit __ () "方法。
with工作原理代码如下:
class demo(): #定义一个demo()类
def __enter__(self):
print("进入enter方法")
return "你好"
def __exit__(self, exc_type, exc_val, exc_tb):
print("进入exit方法")
print("----",exc_type) # exc_type: 错误的类型
print("----",exc_val) # exc_val: 错误类型对应的值
print("----",exc_tb) # exc_tb: 代码中错误发生的位置
def test():
return demo()
with test() as t:
print(t)
执行结果:
第一步先 执行with后面的语句,在执行test()方法后,返回demo()类的对象;
调用demo()类中的__enter__()方法,在接收 __ enter __() 方法后,赋值给t并打印。
第二步在执行完全部方法后,调用 __ exit __ () 方法,释放资源。
with总结:
实际上,在with后面的代码块抛出异常时,exit()方法会被执行。开发库时,清理资源,关闭资源等操作,都可以放在exit()方法中。
总之,with-as 表达式极大地简化了每次写finally的工作,这对代码的优雅性是有极大的帮助的,这也是python语言优雅的一个原因。
with还可以一次性的打开多个文件,如下所示:
with open(“a.txt”) as f1,open(“b.txt”) as f2:
do something
三.文件和路径:
1.fileinput:好处一次可以打开所有文件
1)用fileinput操作文件的作用:
fileinput可以同时读一个或者多个文件中的内容进行迭代、遍历等操作。该模块的input()方法有点类似文件的readlines()方法,区别是前者只是迭代一个对象,每次只生成一行,而后者是一次性读取所有行,当遇到大文件时,无疑前者更有效率。
2)fileinput的常用可选参数:
(1)inplace:用于决定print输出到哪。若inplace = 0,print 则输出到屏幕(即标准输出);若inplace = 1,则把print结果写到文件。默认情况下inplace = 0。
(2)backup:指定文件的扩展名,如.bak,若备份文件存在,则覆盖。
2.fileinput模块中常用的函数:
input(): 返回能够用于迭代 一行或多个文件中所有行的对象
filename(): 返回当前文件的名称
lineno(): 返回当前读取的行的数量
isfirstline(): 返回当前文件行是否为文件的第一行
filelineno(): 返回当前读取行在文件中的行数
执行结果:
执行结果:
3.合并
执行结果:
#.rstrip():作用:去空格和换行符
执行结果:
拆分
文件复制
文件加密
四.乱码解码:
读取文件有两种方式:字节、字符
出现乱码一般是以字符的方式读取,为防止乱码采用字节方式读取
执行结果:
采用utf-8解码
执行结果: