一、文件操作介绍
- 什么是文件
示例如下:
文件.png
- 文件的作用
大家应该听说过一句话:“好记性不如烂笔头”。
不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电脑之后,“哭都没地方哭了”
可见,在把数据存储起来有做么大的价值
使用文件的目的:
就是把一些存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力
二、文件的打开与关闭
- 想一想:
如果想用word编写一份简历,应该有哪些流程呢?
- 打开word软件,新建一个word文件
- 写入个人简历信息
- 保存文件
- 关闭word软件
同样,在操作文件的整体过程与使用word编写一份简历的过程是很相似的
- 打开文件,或者新建立一个文件
- 读/写数据
- 关闭文件
- 打开文件
- 在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件
open(文件名,访问模式)
示例如下:
f = open('test.txt', 'w')
说明:
文件说明.png
- 关闭文件
close( )
- 示例如下:
# 新建一个文件,文件名为:test.txt f = open('test.txt', 'w') # 关闭这个文件 f.close()
结果:
结果.png
结果1.png
三、文件的读写
- 写数据(write)
- 使用write()可以完成向文件写入数据
- demo:
f = open('test.txt', 'w')#打开或创建文件 f.write('hello world, i am here!')#向文件中写的内容 f.close()
结果:
结果.png- 注意:
如果文件不存在那么创建,如果存在那么就先清空,然后写入数据
- 读数据(read)
- 使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据
- demo:
f = open('test.txt', 'r') content = f.read(5) print(content) print("-"*30) content = f.read() print(content) f.close()
结果:
结果.png- 注意:
- 如果open是打开一个文件,那么可以不用谢打开的模式,即只写 open('test.txt')
- 如果使用读了多次,那么后面读取的数据是从上次读完后的位置开始的
- 读数据(readlines)
- 就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素
- demo:
#coding=utf-8 f = open('test.txt', 'r') content = f.readlines() print(type(content)) i=1 for temp in content: print("%d:%s"%(i, temp)) i+=1 f.close()
结果:
结果.png
- 读数据(readline)
- demo:
#coding=utf-8 f = open('test.txt', 'r') content = f.readline() print("1:%s"%content) content = f.readline() print("2:%s"%content) f.close()
结果:
结果.png
- 想一想:
如果一个文件很大,比如5G,试想应该怎样把文件的数据读取到内存然后进行处理呢?
想一想.png
四、应用1:制作文件的备份
- 任务描述
输入文件的名字,然后程序自动完成对文件进行备份
- demo:
# 提示输入文件 oldFileName = input("请输入要拷贝的文件名字:") # 以读的方式打开文件 oldFile = open(oldFileName,'rb') # 提取文件的后缀 fileFlagNum = oldFileName.rfind('.') if fileFlagNum > 0: fileFlag = oldFileName[fileFlagNum:] # 组织新的文件名字 newFileName = oldFileName[:fileFlagNum] + '[复件]' + fileFlag # 创建新文件 newFile = open(newFileName, 'wb') # 把旧文件中的数据,一行一行的进行复制到新文件中 for lineContent in oldFile.readlines(): newFile.write(lineContent) # 关闭文件 oldFile.close() newFile.close()
结果:
结果1.png
结果.png
结果.png
五、文件的定位读写
- 什么是定位?
图.png
图1.png
图2.png
- 获取当前读写的位置
- 在读写文件的过程中,如果想知道当前的位置,可以使用tell()来获取
- demo:
# 打开一个已经存在的文件 f = open("test.txt", "r") str = f.read(3) print("读取的数据是 : ", str) # 查找当前位置 position = f.tell() print("当前文件位置 : ", position) str = f.read(3) print("读取的数据是 : ", str) # 查找当前位置 position = f.tell() print("当前文件位置 : ", position) f.close()
结果:
结果.png
- 定位到某个位置
如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用seek()
seek(offset, from)有2个参数
- offset:偏移量
- from:方向
- 0:表示文件开头
- 1:表示当前位置
- 2:表示文件末尾
- demo:把位置设置为:从文件开头,偏移5个字节
# 打开一个已经存在的文件 f = open("test.txt", "r") str = f.read(30) print("读取的数据是 : ", str) # 查找当前位置 position = f.tell() print("当前文件位置 : ", position) # 重新设置位置 f.seek(5, 0) # 查找当前位置 position = f.tell() print("当前文件位置 : ", position) f.close()
结果:
结果.png
- demo:把位置设置为:离文件末尾,3字节处
# 打开一个已经存在的文件 f = open("test.txt", "rb") # 查找当前位置 position = f.tell() print("当前文件位置 : ", position) # 重新设置位置 f.seek(-3,2) # 读取到的数据为:文件最后3个字节数据 str = f.read() print("读取的数据是 : ", str) f.close()
结果:
结果.png
六、文件、文件夹的相关操作
有些时候,需要对文件进行重命名、删除等一些操作,python的os模块中都有这么功能
- 文件重命名
- os模块中的rename()可以完成对文件的重命名操作
rename(需要修改的文件名, 新的文件名)import os os.rename("毕业论文.txt", "毕业论文-最终版.txt")
- 删除文件
- os模块中的remove()可以完成对文件的删除操作
remove(待删除的文件名)import os os.remove("毕业论文.txt")
- 创建文件夹
import os os.mkdir("张三")
- 获取当前目录
import os os.getcwd()
- 改变默认目录
import os os.chdir("../")
- 获取目录列表
import os os.listdir("./")
- 删除文件夹
import os os.rmdir("张三")
七、应用2:批量修改文件名
- 运行过程演示
运行程序之前
结果.png运行程序之后
结果1.png
- demo:
# coding=utf-8 # 批量在文件名前加前缀 import os funFlag = 1 # 1表示添加标志 2表示删除标志 folderName = './Test/' # 获取指定路径的所有文件名字 dirList = os.listdir(folderName) # 遍历输出所有文件名字 for name in dirList: print() name if funFlag == 1: newName = '[赵四出品]-' + name elif funFlag == 2: num = len('[赵四出品]-') newName = name[num:] print() newName os.rename(folderName + name, folderName + newName)
- 注意:
- 以上程序,在运行之前请先建立info_data.data文件,并且写入一对中括号[]即可
- 等到后面讲解完异常之后就解决了这个问题
八、综合应用:学生管理系统(文件版)
- 参考代码:
# 添加 def add_stu(): print('*********添加学员**********') name = input('请输入学员姓名:') age = input('请输入学员的年龄:') sex = input('请输入学员性别(男/女):') phone = input('请输入手机号:') student = [name, age, sex, phone] student_list.append(student) # 查询 def query_stu(type): print('*************%s学员**************' % type) print('1.查询所有学员') print('2.输入学员姓名查询 ') num = int(input('选择操作:')) if num == 1: for x in range(0, len(student_list)): student = student_list[x] name = student[0] age = student[1] sex = student[2] phone = student[3] print('序号:%s 姓名:%s 年龄:%s 性别:%s 手机号:%s' % (x, name, age, sex, phone)) return student else: name = input('请输入学员姓名:') while 1: rs = False for student in student_list: if student[0] == name: index = student_list.index(student, 0, len(student_list)) print('序号:%s 姓名:%s 年龄:%s 性别:%s 手机号:%s' % ( index, student_list[index][0], student_list[index][1], student_list[index][2], student_list[index][3])) rs = True if rs == False: name = input('未找到学员,请重输:') else: break return student # 封装判断选择序号是否符合范围的函数 # 带返回值的函数,函数执行完会返回一个结果,可以声明变量接受这个结果 def select_num(type): index = input('请选择要%s的学员序号:' % type) index = int(index) while index not in range(0, len(student_list)): index = input('选择的学员不存在,请重选:') index = int(index) # 返回选择的序号 return index # 修改 def alter_stu(): if len(student_list) == 0: print('没有学员信息,无法进行修改操作!') # 强制结束函数的执行,return下面的代码都不会再执行 return query_stu('修改') index = int(select_num('修改')) student = student_list[index] new_name = input('请输入修改后的姓名(%s):' % student[0]) new_age = input('请输入修改后的年龄(%s):' % student[1]) new_sex = input('请输入修改后的性别(%s):' % student[2]) new_phone = input('请输入修改后的手机号(%s):' % student[3]) student[0] = new_name student[1] = new_age student[2] = new_sex student[3] = new_phone print('修改学员成功') # 删除 def dele_stu(): query_stu('删除') index = select_num('删除') rs = input('是否真的删除(y/n):') if rs == 'y': student_list.pop(index) print('删除成功') else: print('删除数据操作已取消!') # 存储至本地文件 def save_data(): file_handle = open('student.v2.txt', 'w') for student in student_list: # 把列表中的数据用空格分开拼接为一个字符串 s = ' '.join(student) file_handle.write(s) file_handle.write('\n') file_handle.close() # 引入python内置函数os import os # 读取文件内容 def read_data(): # 判断文件是否存在,如果存在,在做打开文件的操作 # 如果文件存在返回true,否则返回False rs = os.path.exists('student.v2.txt') if rs == True: # 1,打开文件 file_handle = open('student.v2.txt', mode='r') # 2.读取所有行 contents = file_handle.readlines() # 3.取出每一个姓名 for msg in contents: # 去除\n msg = msg.strip('\n') # 使用 空格分割字符串 student = msg.split(' ') # 将小列表添加到大列表中 student_list.append(student) file_handle.close() # 声明一个大列表,存放学员姓名 student_list = [] read_data() while 1: print('****************学员管理系统*****************') print('*****************1.添加学员*****************') print('*****************2.修改学员*****************') print('*****************3.查询学员*****************') print('*****************4.删除学员*****************') print('*****************0.退出程序*****************') num = input('请选择你的操作:') num = int(num) while num not in range(0, 5): num = int(input('您选择的选项不存在,请重选:')) if num == 1: # 添加学员 add_stu() save_data() elif num == 2: # 修改学员 alter_stu() save_data() elif num == 3: # 查询学员 query_stu('查询') elif num == 4: # 删除学员 print('1.通过序号删除学员') print('2.删除全部学员') print('3.根据学员姓名删除') num = input('请选择操作:') num = int(num) while num not in range(1, 4): num = int(input('所输选项不存在,请重输:')) if num == 1: dele_stu() elif num == 2: rs = input('是否真的删除(y/n):') if rs == 'y': student_list.clear() print('删除成功') else: print('删除数据操作已取消!') else: name = input('请输入想要删除学员的姓名:') rs = input('是否真的删除(y/n):') if rs == 'y': while 1: rs = False for student in student_list: if student[0] == name: student_list.remove(student) print(student_list) print('删除成功') rs = True if rs == False: # print('未找到请重新输入') name = input('未找到学员,请重输:') else: break else: print('删除数据操作已取消!') save_data() else: print('退出程序') break
运行截图:
结果.png
查询所有.png
根据姓名查询.png
添加.png
修改.png
删除.png
网友评论