主要内容:持续化储存文件操作
一、文件操作介绍
1、在python中使用open函数,可以打开一个已经存在的文件,或者创建一个新的文件。
格式:open(文件名,访问模式) e.g.f = open(test.txt,‘w’)
如果文件不存在那么先清空,然后在写入数据
2、
r:有读权限、没有写的权限、文件不存在不会创建文件、文件操作不会清空文件
w:没有读取权限、有写权限、文件不存在会创建文件、文件操作会清空文件
a:没有读的权限、有写的权限、文件不存在会创建文件、文件操作不会清空文件
r+:有读的权限、有写的权限、文件不存在不会创建文件、文件操作不会清空文件
w+:有读的权限、有写的权限、文件不存在会创建文件、文件操作会清空文件
a+:有读的权限、有写的权限、文件不存在会创建文件、文件操作不会清空文件
3、File对象的属性
file.closed :如果文件关闭返回True、否则返回False
file.mode:返回打开文件的访问模式
file.name:返回文件的名称
file.softspace:如果print输出后,必须返回一个空格符,则返回False,否则返回True
4、File对象的常用方法:
读:{read:读取指定字节,默认1024;readline:读取文件的一行内容;readlines:读取文件所有内容返回一个列表}
写:{write:从指针所在位置写入,写入是字符内容;writelines:将列表的每个元素写入文件}
定位:{tell:指针当前所在位置;seek:移动指针位置}
5、seek(offset,from)有2个参数:
offset:偏移量
from:方向,0:表示文件开头;1:表示文件当前位置;2:表示文件末尾位置
6、文件的关闭
1)调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象占用操作系统的资源,并且操作系统同一时间打开的文件数量也是有限的;
2)也可以使用with语句来自动帮我们调用close()方法:
格式:with open(‘doc/passwd’,‘r’) as f:
二、 os 模块
1、os,语义定义为操作系统,处理操作系统相关的功能,可跨平台
import os
#1)返回操作系统类型,值为posix,是linux,值为nt,为windows操作系统
print(os.name)
print('Linux' if os.name == 'posix' else 'Windows')
#2)操作系统的详细信息
# info = os.uname()
# print(info)
# print(info.sysname)
# print(info.nodename)
#Windows下uname不能使用
#3)通过key值获取环境变量对应的value值
print(os.environ.get('PATH'))
print(os.getenv("PATH"))
2、关于路径
#1判断是否为绝对路径—‘/tmp/hello’,‘hello.png’
print(os.path.isabs(’/tmp/hello’))
print(os.path.isabs(‘hello.png’))
#2 生成绝对路径
print(os.path.abspath(’/tmp/hello’))
print(os.path.abspath(‘hello’)
#3’hello.png’
print(os.path.join(’/home/kiosk’,‘hello.png’))
#4获取目录名或者文件名
filename = ‘/doc/passwd.png’
print(os.path.basename(filename))
print(os.path.dirname(filename))
#5创建目录/删除目录
os.makedirs()
os.mkdir(‘img’)
os.rmdir(‘img’)
#6创建文件/删除文件
os.mknod(‘00_ok.txt’)
os.remove(‘00_ok.txt’)
#7文件重命名
os.rename(‘data.txt’,‘data1.txt’)
#8判断文件或者目录是否存在
print(os.path.exists(‘img’))
#9分离后缀名和文件名
print(os.path.spiltext(‘hello.png’))
print(os.path.spilt(‘hello.png’))
#10 将目录名和文件名分离
print(os.path.spilt(’/tmp/hello.png’))
三、json模块
1、JSON是一种轻量级的数据交换式,它基于ECMAScript的一个子集。JSON完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯
2、dump:将对象序列化并保存文件
load:将序列化字符串从文件读取并反序列化
格式: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=True:中文存储需要设定。
indent=4:增加缩进,增强可读性,但缩进空格会使数据变大。
separators=(’,’,’:’): 自定义分隔符,元素间分隔符为逗号, 字典key和value值的分隔符为冒号。
sort_keys=True: 字典排序
四、pickle模块
1、JSON只能处理基本数据类型。pickle能处理所有python的数据类型。
2、JSON用于各种语言之间的字符转换。pickle用于python程序对象的持久化或者python程序间对象网络传输,但不同版本的python序列化可能还有差异。、
例一:
批量修改文件名
import os
funFlag = 2
foldName = 'doc/'
dirlist = os.listdir(foldName)
for i in dirlist:
if funFlag == 1:
newName = '[西部开源]'+ i
elif funFlag == 2:
num = len('[西部开源]')
newName = i[num:]
print('重命名%s为%s成功'%(i,newName))
os.rename(foldName + i,foldName + newName)
例二:
1、读取一个文件,显示除了以井号(#)开头的行以外的所有行。
#打开文件
f = open('doc/group','a+')
#将指针移动至开头
f.seek(0,0)
print(f.tell())
list_in = []
list_notin = []
for i in range(6):
list_read = f.readline()
if '#' not in list_read:
list_in.append(list_read)
else:
list_notin.append(list_read)
print('不带#好的有:',list_in)
print('带#号的有:',list_notin)
list_in_str = str(list_in)
with open('doc/group1','w') as f:
f.write(list_in_str)
例三:
2、制作一个"密码薄",其可以存储一个网址(例如 www.youkuaiyun.com),和一个密码(例如 123456),请编写程序完成这个“密码薄”的增删改查功能,并且实现文件存储功能。
def file():
dict = {}
while True:
i = int(input('请输入要进行的操作 0-->退出 1-->增加;2-->删除;3-->显示;4-->修改:'))
if i == 1:
website = input('请输入要存储的网站:')
passworld = int(input('请输入密码:'))
dict[website] = passworld
elif i == 2:
website_del = input('请输入要删除的网站:')
del dict[website_del]
elif i == 3:
print(dict)
elif i == 4:
amend_info = input('请输入要修改信息的网站:')
if amend_info in dict.keys():
amend_i = int(input('您是否要修改网站;11-->修改,12-->不修改:'))
if amend_i == 11:
value_old = dict.setdefault(amend_info)
del dict[amend_info]
new_web = input('请输入新的网站:')
dict[new_web] = value_old
amend_j = int(input('您是否要修改密码;21-->修改,22-->不修改:'))
if amend_j == 21:
del dict[amend_info]
new_key = input('请输入修改后的密码:')
dict[amend_info] = new_key
elif amend_j == 22:
pass
elif amend_i == 12:
pass
else:
print('您输入的网站不存在!')
else:
break
with open('info', 'w') as f:
f.write('%s\n'%dict)
f.close()
file()
例四:
- 学生管理系统(文件版)
1). 必须使用自定义函数,完成对程序的模块化
2). 学生信息至少包含:姓名、年龄、学号,除此以外可以适当添加
3). 必须完成的功能:添加、删除、修改、查询、退出
def student():
print("-" * 30)
print(" 学生管理系统 ")
print(" 1.添加学生的信息")
print(" 2.删除学生的信息")
print(" 3.修改学生的信息")
print(" 4.查询学生的信息")
print(' 5.遍历所有学生的信息')
print(" 6.退出系统")
print('-' * 30)
students = []
while True:
#对用户呈现选择栏
student()
key = int(input('请输入要进行的操作:'))
if key == 1:
print('您选择了学生信息的添加')
stuname = input('请输入学生的姓名')
stuid = input('请输入学生的学号')
stuage = input('请输入学生的年龄')
#定义一个字典用来存放学生信息
stuInfo = {}
stuInfo['name'] = stuname
stuInfo['id'] = stuid
stuInfo['age'] = stuage
students.append(stuInfo)
elif key == 2:
print('您选择了学生信息的删除')
del_student = input('请输入要删除学生学号:')
i = 0
leap = 0
for temp in students:
if temp['id'] == del_student:
leap = 1
break
else:
i += 1
if leap == 0:
print('没有这个学生')
else:
del students[i]
print('删除成功!')
elif key == 3:
print('那您选择的是学生信息的修改')
alterid = input('请输入要修改的学生的学号:')
i = 0
leap = 0
for temp in students:
if temp['id'] == alterid:
leap = 1
break
else:
i += 1
if leap == 1:
while True:
alterNum = int(input('请选择您要修改的项目1-->name,2-->id,3-->age '))
if alterNum == 1:
newname = input('输入要修改后的name:')
i = 0
leap1 = 0
for item in students:
if item['name'] == newname:
leap1 = 1
break
else:
i += 1
if leap1 == 1:
print('姓名重复修改失败!')
else:
item['name'] = newname
break
elif alterNum == 2:
newid = input('输入要修改后的id:')
i = 0
leap2 = 0
for item in students:
if item['id'] == newid:
leap2 = 1
break
else:
i += 1
if leap2 == 1:
print('学号重复修改失败!')
else:
item['id'] = newid
break
else:
newage= input('输入要修改后的age:')
i = 0
leap3 = 0
for item in students:
if item['age'] == newage:
leap3 = 1
break
else:
i += 1
if leap3 == 0:
print('数据重复修改失败!')
else:
item['age'] = newage
break
else:
print('此学生不存在!')
elif key == 4:
print('您选择了学生信息的查询')
fun_student = input('请输入要查询学生学号:')
i = 0
leap = 0
for temp in students:
if temp['id'] == fun_student:
leap = 1
break
else:
i += 1
if leap == 0:
print('没有这个学生')
else:
print('查询学生信息如下:%s %s %s'%(temp['name'],temp['id'],temp['age']))
print('查询成功!')
elif key == 5:
print('学生信息如下')
print('name id age')
for temp in students:
print('%s %s %s'%(temp['name'],temp['id'],temp['age']))
print('*'* 20)
elif key == 6:
print('谢谢使用学生管理系统')
break
with open('info_high', 'w') as f:
f.write('%s\n'%students)
f.close()