一、文件的打开与关闭
1、文件的打开
在Python中,open方法用来打开文件,语法格式如下:
open(文件名[, 访问模式,encoding=编码格式])
上述格式中,“文件名”必须要填写,“访问模式”和“encoding”是可选的。
注意:使用open方法打开文件时,如果没有注明访问模式(默认是只读的访问模式),则必须保证文件是存在的,否则就会报错。如下所示:
2、文件模式
如果使用open方法打开文件时,只带一个文件名,那么我们只能读取文件。如果打开的文件允许写数据,则必须指明文件的模式。Python中文件的访问模式有多种,如下所示:
- r 以只读方式打开文件(read)。文件的指针将会放在文件的开头。默认模式。
- w 打开一个文件只用于写入(write)。如果该文件已存在则将其覆盖;若文件不存在,创建新文件
- a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建文件并写入。
- rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。默认模式。
- wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖;若文件不存在,创建新文件。
- ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建文件并写入。
- r+ 打开一个文件用于读写。文件指针将会放在文件的开头。文件若不存在,程序会crash。
- w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖;若文件不存在,创建新文件。
- a+ 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建文件用于读写。
- rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
- wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖;若文件不存在,创建新文件。
- ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。
3、文件的关闭
凡是打开的文件,切记要使用close方法关闭。即使文件会在程序退出后自动关闭,但是考虑到数据的安全性,在每次使用完文件后,都要使用close方法关闭文件,否则一旦程序崩溃,
很可能导致文件中的数据没有保存。close方法使非常简单,如下所示:
f = open('test.txt')
f.close()
4、安全的打开关闭文件的方式(自动调用close方法)
with open("d://test.txt","w") as f:
f.write("hello python")
或者
with open("d://test.txt","w",endconding="utf-8") as f:
f.write("hello 你好")
二、文件的读写
1、写文件
1.1 向文件写数据,需要用到write方法来完成,在操作某个文件时,每调用一次write方法,写入的数据就会追加到文件末尾。示例如下所示:
f = open('itheima.txt','w')
f.write('hello itheima, i am here!')
f.write('\n')
f.write('hello itheima, i am here!')
f.write('\n')
f.write('hello itheima, i am here!')
f.write('\n')
注意:当向文件写入数据的时候,如果文件不存在,那么系统会自动创建一个文件并写入数据。如果文件存在,那么会清空原来文件的数据,重新写入新的数据。
1.2 writelines向文件写入一个字符串序列
f = open("test.txt","w",encoding="utf-8")
f.writelines(["张三\n","李四\n","王五\n"])
f.close()
2、读文件
从文件中读取数据时,可以通过多种方式来获取,具体如下。
2.1 使用read方法读取文件
read方法可以从文件中读取数据,该方法的定义语法如下:
read(size)
上述方法中,size表示要从文件中读取的数据的长度,单位为字节。如果没有指定size,那么就表示读取文件的全部数据。
使用read方法读取文件示例如下所示:
f = open('itheima.txt','r')
content = f.read(12)
print(content)
print('-'*30)
content = f.read()
print(content)
f.close()
注意:多次读取文件时,每次读取文件都会接着上次读取的位置读后面的数据。
2.2 使用readlines方法读取文件
如文件的内容很少,则可以使用readlines方法把整个文件中的内容进行一次性读取。readlines方法会返回一个列表,列表中的每一个元素为文件中的每一行数据。假设文件“itheima.txt”里面有3行数据“hello itheima, i am here!”,那么,使用readlines方法读取文件的方式如下所示:
f = open('itheima.txt','r')
content = f.readlines()
print(type(content))
i = 1
for temp in content:
print("%d:%s" %(i,temp))
i += 1
f.close()
2.3 使用readline方法一行一行读取数据
同样,以读取itheima.txt文件为例,该文件包含了三行数据,那么使用readline方法读取文件内容的方式如下所示:
f = open('itheima.txt','r')
content = f.readline()
print('1:%s'%content)
content = f.readline()
print('2:%s'%content)
f.close()
思考题:
如果一个文件很大,如5GB,试想应该怎么样把文件的数据读取到内存然后进行处理。
三、文件读写应用--制作文件的备份
实际开发中,文件的读写可以完成很多功能,如文件的备份就是文件读写的过程。假设,现在有一个文件“data.txt”,该文件存储的数据如下所示:
If you were a teardrop;In my eye,
For fear of losing you,I would never cry.
And if the golden sun,Should cease to shine its light,
Just one smile from you,Would make my whole world bright.
此时,如果想制作data.txt的备份文件,则需要读取原文件的数据,并将获取的数据写入备份文件。接下来,通过代码演示,如下所示:
oldFileName = input("Please enter the name of the file to be copied:")
oldFile = open(oldFileName,'r')
if oldFile:
fileFlagNum = oldFileName.rfind('.')
if fileFlagNum > 0:
fileFlag = oldFileName[fileFlagNum:]
newFileName = oldFileName[:fileFlagNum] + '[copy]' + fileFlag
newFile = open(newFileName, 'w')
for lineContent in oldFile.readlines():
newFile.write(lineContent)
oldFile.close()
newFile.close()
四、文件的定位读写
通过前面的了解,文件的读写都是顺序进行的。但是在实际开发中,可能会需要从文件的某个特定位置开始读写,这时,我们需要对文件的读写位置进行定位,包括获取文件
当前的读写位置,以及定位到文件的指定读写位置。接下来详细介绍这两种定位方式。
1、使用tell方法来获取文件当前的读写位置
在读写文件的过程中,如果想知道当前位置,可以使用tell方法获取。tell方法返回文件的当前位置,即文件指针当前位置。
使用tell方法获取文件当前读写位置示例如下:
f = open('test.txt','r')
str = f.read(4)
print('read data is :',str)
position = f.tell()
print('The current position :',position)
str = f.read(8)
print('read data is :',str)
position = f.tell()
print('The current position :',position)
str = f.read(3)
print('read data is :',str)
position = f.tell()
print('The current position :',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,表示从文件末尾开始偏移
使用seek方法获取文件当前读写位置示例如下:
f = open('test.txt','r')
str = f.read(15)
print('read data is :',str)
position = f.tell()
print('The current position :',position)
f.seek(4)
position = f.tell()
print('The current position :',position)
f.close()
五、文件的重命名和删除
有些时候,需要对文件进行重命名、删除等一些操作,Python的OS模块已经默认包含了这些功能,接下来,详细介绍这些操作。
1、文件的重命名
OS模块的rename方法可以实现完成对文件的重命名操作,格式如下:
OS.rename(src,dst)
其中src指的是需要修改的文件名,dst指的是修改之后的新的文件名。
示例:
import OS
OS.rename('毕业论文.txt','毕业论文-最终版.txt')
2、文件的删除
OS模块的remove方法可以实现完成对文件的删除操作,格式如下:
OS.remove(path)
path指的是指定路径下的文件。
示例:
import OS
OS.remove('毕业论文.txt')
六、文件夹的相关操作
1、创建文件夹
OS模块的mkdir方法用来创建文件夹,示例代码如下所示:
import OS
OS.mkdir('wzb')
2、获取当前目录
OS模块的getcwd方法用来获取当前的目录,示例代码如下所示:
import OS
OS.getcwd()
3、改变默认目录
OS模块的chdir方法用来改变默认目录,例如,将当前目录改为上一级目录,代码如下所示:
import OS
OS.chdir('../')
4、获取目录列表
OS模块的listdir方法用来获取目录列表,例如,要获取当前路径下的子目录,代码如下所示:
import OS
OS.listdir('./')
5、删除空文件夹
OS模块的rmdir方法用来删除文件夹,例如,下面的代码删除了当前路径下的“wzb”目录:
import OS
OS.rmdir('wzb')
6、删除非空文件夹
import shutil
shutil.rmtree("d://testdir123")