python中持久化存储操作

持久化存储操作

01 文件操作的介绍

###文件的打开:在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。open(文件名,访问模式) e.g. f = open(‘test.txt’, ‘w’)。如果文件不存在那么创建,如果存在那么就先清空,然后写入数据
文件的打开模式总结:
在这里插入图片描述
在这里插入图片描述
要读取二进制文件,比如图片、视频等等,用’rb’, ‘wb’, 'ab’等模式打开文件即可.
File对象的属性:
在这里插入图片描述
File对象的常用方法:
在这里插入图片描述

Seek方法:
seek(offset, from)有2个参数: offset:偏移量 from:方向
0:表示文件开头;
1:表示当前位置;
2:表示文件末尾
1). 把位置设置为:从文件开头,偏移5个字节
2). 把位置设置为:文件最开始
3). 把位置设置为:文件最末尾

文件的关闭

方法一:调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
方法二:Python引入了with语句来自动帮我们调用close()方法:
with语句工作原理:python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会自动执行规定的(“清理”)操作,释放被访问的资源,比如有文件读写后自动关闭、线程中锁的自动获取和释放等。

with open('/etc/passwd') as f:
    print('in with:',f.closed)
    print(f.readlines()[-1])
print('out with:',f.closed)
#以读的方式打开只能由来读取文件,不能新建
#f = open('doc/hello.txt','r')
#print(f.read())
#f = open('doc/hello.txt','w')
#
#f.write('hello python\n')
#print('写入成功')
#print('读取文件中。。。',f.read())
f = open('doc/hello.txt','a+')
#f.seek(0,0)
#print(f.read())
f.write('hello world')
f.seek(0,0)
print(f.read())
print(f.closed)
print(f.mode)
print(f.name)
#print(f.softspace)
f.close()
print('文件关闭之后。。')
print(f.closed)
print(f.mode)
print(f.name)

项目案例:文件的备份:cp命令

import os
src_filename = input("要拷贝的文件: ")
#1). 判断文件是否存在
if os.path.exists(src_filename):
    dst_filename = input("目标文件: ")
    # 2). mode='r'打开文件读取文件内容
    # 注意: 要读取二进制文件,比如图片、视频等等,用'rb', 'wb', 'ab'等模式打开文件即可.
    src_f = open(src_filename, 'rb')
    content = src_f.read()
    # 3). mode='r'打开文件写入要拷贝的文件内容
    dst_f = open(dst_filename, 'wb')
    dst_f.write(content)
 # 4). 关闭文件对象
    src_f.close()
    dst_f.close()
     print('拷贝成功')
else:
    print("要拷贝的文件%s不存在" %(src_filename))

文件的读写操作:

from collections.abc import Iterable
f = open('/etc/passwd', 'r')
#当文件比较小时, 使用read、readlines方法读取.
print(f.read())
print('*'*50)
#当文件比较大时, 使用readline方法读取.
#将指针移动到文件最开始, 然后指针向右移动5个字节。
f.seek(5, 0)
print(f.readline())
print(f.readline())
print('*'*50)
#将指针移动到文件最开始,
f.seek(0, 0)
print(f.readlines())

#名词: 可迭代对象: 可以通过for循环遍历的对象
#print("文件对象时可迭代对象吗? ", isinstance(f, Iterable))
for index, line in enumerate(f):
    print("第%s行" %(index+1), line)

from collections.abc import Iterable
#需求: 将/etc/passwd文件后5行写入doc/world.txt文件
f1 = open('/etc/passwd')
tail_five_line = f1.readlines()[-5:]
#print(tail_five_line)
#print(len(tail_five_line))
f2 = open('doc/world.txt', 'w')
f2.writelines(tail_five_line)
print("write ok")

02 OS模块

关于操作系统

os,语义为操作系统,处理操作系统相关的功能,可跨平台。 比如显示当前目录下所
有文件/删除某个文件/获取文件大小…

import os
#1). 返回操作系统类型, 值为posix,是Linux操作系统, 值为nt, 是windows操作系统
print(os.name)
os_name = 'Linux' if os.name =='posix' else 'Windows'
print("当前操作系统: %s" %(os_name))

#2). 操作系统的详细信息
detail_info = os.uname()
print(detail_info)
print("主机名:", detail_info.nodename)
print("硬件架构:", detail_info.machine)
print("系统名称:", detail_info.sysname)
print("Linux内核的版本号:", detail_info.release)
#3). 系统环境变量等价于Linux的env命令
print(os.environ)
#4). 通过key值获取环境变量对应的value值
print(os.environ['PATH'])

关于路径

import os
from os.path import isabs, abspath, join

#1. 判断是否为绝对路径---'/tmp/hello', 'hello.png', 'qq/hello.mp3'
print(isabs('/tmp/hello'))
print(isabs('hello.py'))

#2. 生成绝对路径
#filename = 'hello.py'
filename = '/tmp/hello.py'
if not isabs(filename):
    print(abspath(filename))

#3. 'hello.png'
#返回一个绝对路径: 当前目录的绝对路径+ 文件名/目录名
#'/tmp/hello' , 'python.txt'   ==== /tmp/hello/python.txt
#C:\tmp\hello\python.txt
print(join('/tmp/hello', 'python.txt'))

OS模块

• os模块中的rename()可以完成对文件的重命名操作。rename(需要修改的文件名, 新的文件名)
• os模块中的remove()可以完成对文件的删除操作remove(待删除的文件名)

4关于文件和目录的操作

文件批量重命名

  1. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png)
  2. 将当前img目录所有以.png结尾的后缀名改为.jpg.

03 json模块详解

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

python数据类型和json数据格式互相转换规则

在这里插入图片描述

python 中str类型到JSON中转为unicode类型,None转为null,dict对应object;
pyhton中的集合不能转成json格式。

在这里插入图片描述

序列化和反序列化的常用操作:

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
encoding=“utf-8”, default=None, sort_keys=False, **kw)

• ensure_ascii=False: 中文存储需要设定
• indent=4: 增加缩进,增强可读性,但缩进空格会使数据变大
• separators=(’,’,’:’): 自定义分隔符,元素间分隔符为逗号, 字典key和value值的分隔符为冒号
• sort_keys=True: 字典排序

自定义复杂数据类型编解码

例如我们碰到集合对象, datetime对象,或者自定义的类对象等json默认不支持的数据类型时,我们就需要自定义编解码函数。有两种方法来实现自定义编解码。

import json
info = dict(user1='00000', user2='11111', 粉条='1111')
### 存储Json数据

#编码: 字典转成json数据格式
json_info = json.dumps(info)
print(info, json_info)
print(type(info), type(json_info))

#编码: 字典转成json并存储未文件
json.dump(info, open('doc/info.json', 'w'), indent=4, ensure_ascii=False)
print("写入json文件成功")

加载json数据

import json

filename = 'doc/info.json'
#解码: 将文件中的json数据转换成python对象及型处理
python_info = json.load(open(filename))
print(python_info)
print(python_info.get('粉条'))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值