Python文件操作

每日一记

打开并读取文件

#不安全代码
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数据格式,它会在目录下生成三个文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值