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其实没有那么难。