1.文件的打开与关闭
在Python中操作文件的整体过程很简单:
1).打开文件。
2).读/写数据。
3).关闭文件。
1.1文件的打开
在Python中,open方法用来打开文件,语法格式如下:
open(文件名[,访问模式])
上述格式中,“文件名”必须要填写,“访问模式”是可选的。
例如打开一个名称为“test.txt”的文件,示例代码如下:
f = open("test.txt")
需要注意的是,使用open方法打开文件时,如果没有注明访问模式,则必须保证文件是存在的,否则会报如下异常信息。
1.2文件模式
如果使用open方法打开文件时,只带一个文件名,那么我们只能读取文件。如果打开的文件允许写数据,则必须指明文件的模式。Python中文件的访问模式有很多种。
在罗列的模式中,“rb”“wb”“ab”模式都是以二进制的方式操作文件,通常这几种模式用于处理二进制类型的文件,如声音或者图像等。
1.3文件的关闭
凡是打开的文件,切记要使用close方法关闭。即使文件会在程序退出后自动关闭,但是考虑到数据的安全性,在每次使用完文件后,都要使用close方法关闭文件,否则一旦程序崩溃,很可能导致文件中的数据没有保存。close方法的使用非常简单,具体示例如下:
#新建一个文件,文件名为:test.txt
f = open("Python.txt","w")
#关闭这个文件
f.close()
2.文件的读写
文件最重要的能力是接收数据或者提供数据。文件的读写,无非是将数据写入文件或者从文件中读取数据,接下来,本节将分别针对文件的读写进行讲解。
2.1写文件
向文件写数据,需要使用write方法来完成,在操作耨个文件时,每调用一次write方法,写入的数据就会追加到文件末尾,接下来,通过一个案例来演示。
[1]: f = open("Python.txt","w")
[2]: f.write("Hello Python,i am here!")
[3]: f.write("\n")
[4]: f.write("Hello Python,i am here!")
[5]: f.write("\n")
程序运行后,会在程序所在的路径下生成一个名为Python.txt的文件。打开该文件,可以看到数据成功被写入。注意:当向文件写入数据是,如果文件不存在,那么系统会自动创建一个文件并写入数据。如果文件存在,那么会清空原来文件的数据,重新写入新数据。
2.2读文件
从文件中读取数据时,可以通过多种方式来获取,具体如下。
1.使用read方法读取文件
read方法可以从文件中读取数据,该方法的定义语法如下:
raad(size)
上述方法中,size表示要从问及那种读取的数据的长度,单位为字节。如果没有指定size,那么就表示读取文件的全部数据。
使用read方法读取文件
f = open("Python.txt","r")
content = f.read(12)
print(content)
print("-"*30)
content = f.read()
print(content)
f.close()
运行结果:
2.使用readlines方法读取文件
若文件的内容很少,则可以使用readlines方法把整个文件中的内容进行一次性读取。readlines方法会返回一个列表,列表中的每一个元素为文件中的每一行数据。假设文件“Python.txt”里有3行数据“Hello Python, i am here!”,那么,使用readlines方法读取文件的方式如下面所示。
f = open("Python.txt","r")
content = f.readlines()
num = 1
for temp in content:
print("%d:%s"%(num,temp))
num += 1
f.close()
运行结果:
3.使用readline方法一行一行读数据
同样,以读取Python.txt文件为例,该文件包含了3行数据,那么使用readline方法读取文件的方式如下面所示。
f = open("Python.txt","r")
content = f.readline()
print("1:%s"%content)
content = f.readline()
print("2:%s"%content)
f.close()
运行结果:
2.3文件读写的应用——制作文件的备份
实际开发中,文件的读写可以完成很多功能,如文件的备份就是文件读写的过程。假设,现在又一个文件“data.txt”,该文件储存的数据如图:
此时,如果想制作data.txt的备份文件,则需要读取源文件的数据,并将获得的数据写入备份文件。与原文件相比,备份文件储存的数据于源文件是一样的。接下来,通过代码来演示。
oldFileName = input("请输入要拷贝的文件的名字:")
oleFile = open(oldFileName,"r")
#如果打开文件
if oldFile:
#提取文件的后缀
fileFlagNum = oldFileName.rfind(".")
if fileFlagNum > 0:
fileFlag = oldFileName[fileFlagNum:]
#组织新的文件名字
newFileName = oldFileName[:fileFlagNum] + "[复件]" + fileFlag
#创建新文件
newFile = open(newFileName."w")
#把就文件中的数据,一行一行地复制到新文件中
for lineContent in oldFile.readlines():
newFile.write(lineContent)
#关闭文件
oldFile.close()
newFile.close()
运行程序,发现备份制作成功。
2.4文件的定位读写
在前面的学习中,文件的读写都是顺序进行的。但是在实际开发中,可能会需要从某个特定位置开始读写,这是,我们需要对文件的读写进行定位,包括获取文件当前读写位置。接下来对两种定位方式进行详细介绍,具体如下:
1.使用tell方法来获取文件当前的读写位置
在读写文件的过程中,如果想知道当前的位置,可以使用tell方法来获取。tell方法返回文件当前的位置,即文件指针当前的位置。
假设文件“Python.txt”的内容如下:
Hello Python, i am here!
Hello Python, i am here!
Hello Python, i am here!
此时,使用read方法读取文件数据的时候,获取当前数据的位置。
使用tell方法获取文件当前的读写位置。
#打开一个已经存在的文件
f = open("Python.txt","r")
str1 = f.read(4)
print("读取的数据是:",str1)
#查找当前位置
position = f.tell()
print("当前文件位置:",position)
str1 = f.read(8)
print("读取的数据是:",str1)
#查找当前位置
position = f.tell()
print("当前文件位置:",position)
str1 = f.read(3)
print("读取的数据是:",str1)
#查找当前位置
position = f.tell()
print("当前文件位置:",position)
f.close()
运行结果:
2.使用seek方法定位到文件的指定读写位置
如果在读写文件的过程中,需要从指定的位置开始读写操作,就可以使用seek方法实现。
seek方法的定义语法如下:
seek(offset[,whence])
seek方法的参数介绍如下:
(1)offset:表示偏移量,也就是需要移动的字节数。
(2)whence:表示方向,该参数得值有三个:
①SEEK_SET或0:whence参数的默认值,表示文件的起始位置开始偏移。
②SEEK_CUR或1:表示从文件当前的位置开始偏移。
③SEEK_END或2:从文件末端开始偏移。
同样以上面的文件“Python.txt”为例,假设要从文件开头偏移四个字节。
使用seek方法定位到文件的指定位置。
f = open("Python.txt","r")
str1 = f.read(15)
print("读取的数据是:",str1)
#查找当前位置
position = f.tell()
print("当前文件位置:",position)
#重新设置位置
f.seek(4)
#查找当前位置
position = f.tell()
print("当前文件位置:",position)
f.close()
运行结果:
如果将文件的读写位置定位在当前位置偏移四个字符的位置。
#打开一个已存在的文件
f = open("Python.txt","rb+")
str1 = f.read(15)
print("读取的数据是:",str1)
#查找当前位置
position = f.tell()
print("当前文件位置:",position)
#重新设置位置
f.seek(5,1)
#查找当前位置
position = f.tell()
print("当前文件位置:",position)
f.close()
运行结果:
将文件的读写位置定位在文件末尾三字节处。
#打开一个已经存在的文件
f = open("Python.txt","rb+")
str1 = f.read(15)
print("读取的数据是:",str1)
#查找当前位置
position = f.tell()
print("当前文件位置:",position)
#重新设置位置
f.seek(-4,2)
#查找当前位置
position = f.tell()
print("当前文件位置:",position)
f.close()
运行结果:
3.文件的重命名和删除
有时候需要对文件进行重命名、删除等操作,Python的os模块默认已经包含了这些功能。
3.1文件的重命名
os模块的rename方法可以完成对文件的重命名操作,格式如下:
os.rename(src,dst)
上述格式中,src指的是需要修改的文件名,dst指的是修改后的新文件名。
import os
os.rename("python.txt","Python.txt")
3.2文件的删除
os模块的remove方法可以完成对文件的删除操作,格式如下:
os.remove(path)
上述格式中,path指的是指定路径下的文件。
import os
os.remove("Python.txt")
4.文件夹的相关操作
实际开发中,有时需要用程序的方式对文件夹进行一定的操作,如创建、删除等。就像对文件操作需要os模块一样,如果要操作文件夹,同样需要os模块。
4.1创建文件夹
os模块的mkdir方法用来创建文件夹。
import os
os.mkdir("Neusoft")
4.2获取当前目录
os模块的getcwd方法用来获取当前的目录。
import os
os.getcwd()
4.3改变默认目录
os模块的chdir方法来改变默认目录,例如,将当前目录改编为上一级目录的代码如下:
import os
os.chdir("../")
4.4获取目录列表
os模块的listdir方法用来获取目录列表,例如,要获取当前路径下的子目录列表,代码如下:
import os
os.list("./")
4.5删除文件夹
os模块的rmdir方法用来删除文件夹。
import os
os.rmdir("Neusoft")
5.文件操作的应用—批量修改文件名
在日常生活中,经常会根据某些需求对文件的名字进行修改,可是,如果需要修改的文件太多,一个一个修改文件名的效率显然是很低的。这时我们可以借助刚学习的文件操作,编写一个批量修改文件名的小程序,这样省时省力,可以极大地提高工作效率。
假设现在有一批文件的名称需要修改,修改前和修改后的文件名如下图所示:修改前的文件名修改后的文件名
#批量在文件名前加前缀
import os
funFlag = 1
#1 表示添加标志 2 表示删除标志
folderName = "./"
#获取指定路径的所有文件名字
dirList = os.listdir(folderName)
#遍历输出所有文件名字
for name in dirList:
print(name)
if funFlag == 1:
newName = "[Python]-" + name
elif funFlag == 2:
num = len("[Python]-")
newName = name[num:]
print(newName)
os.rename(folderName+name,folderName+newName)
6.文件案例——学生管理系统(文件版)
前面在开发学生管理系统的时候,数据都是储存在变量中的。一旦程序结束或者崩溃,那么之前储存的数据都会消失。为了预防这种情况发生,我们可以借助文件来来储存数据。接下来,我们在之前的基础上,新增一个保存学生信息的功能,具体步骤如下。
(1)在表示菜单列表的函数中,新增一个保存数据的功能项,代码如下:
#打印功能提示
def printMenu():
print("=" * 30)
print("学生管理系统")
print("1.添加学生信息")
print("2.删除学生信息")
print("3.修改学生信息")
print("4.显示所有学生信息")
print("5.保存数据")
print("0.退出系统")
print("=" * 30)
(2)作为程序员,应该考虑写入数据后可以读取出来。我们知道,所有学生的信息保存在变量stuInfo中,它里面是多个字典。但是,write函数传入的参数必须是字符串类型,所以需要把字典强制转换成字符串。定义保存数据的函数,代码如下:
#保存当前所有的学生信息到文件中
def saveFile():
f = open("backup.data","w")
f.write(str(stuInfos))
f.close
(3)从文件读取到的内容是字符串,我们可以把这些带有特定格式的字符串转换成其原有的类型,所以调用eval函数把字符串转换成字典。定义从文件中恢复数据的函数,代码如下:
#恢复数据
def recoverData():
global stuInfos
f = open("backup.data")
content = f.read()
stuInfos = eval(content)
f.close()
(4)在main函数中执行,代码如下:
def main():
recoverData()#必须保证读取的文件中有数据
while 1 == 1:
printMenu()#打印功能菜单
key = input("请输入功能对应的数字:")
if key == "1":#添加学生信息
addStudent()
elif key == "2":#删除学生信息
delStudent(studentInfos)
elif key == "3":#修改学生信息
modifyStudent()
elif key == "4":#显示所有学生信息
showStudent()
elif key == "5":#保存学生信息到文件
saveFile()
elif key == "0":#退出系统
quitConfirm = input("真的要退出系统吗?(Yes or No):")
if quitConfirm == "Yes":
break
elif exit == "No":
pass
else:
print("输入有误,请重新输入")
else:
print("输入有误,请重新输入")
运行程序,添加一个学生信息并保存,如图所示。
打开backup.data文件,发现新增的数据成功保存到了文件中,如图所示。
Python其实没有那么难。