Python中的文件操作、综合应用
2019-03-25 本文已影响249人
辽A丶孙悟空
一、文件操作介绍
- 什么是文件
示例如下:
文件.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
文件.png
文件说明.png
结果.png
结果1.png
结果.png
结果.png
结果.png
结果.png
想一想.png
结果1.png
结果.png
结果.png
图.png
图1.png
图2.png
结果.png
结果.png
结果.png
结果.png
结果1.png
结果.png
查询所有.png
根据姓名查询.png
添加.png
修改.png
删除.png