文件
文件概述
相信大家对文件并不陌生,它可以存储文字、图片、音乐、视频等,如图所示。总之,文件是数据的集合,可以有不同的类型。
在这里插入图片描述按数据的组织形式,文件大致可以分为如下两类。
1.文本文件
文本文件是一种由若干字符构成的文件,可以用文本编辑器进行阅读或编辑。以txt、py、html等为后缀的文件都是文本文件。
2. 二进制文件
二进制文件一般是指不能用文本编辑器阅读或编辑的文件。以mp3、mp4、png等为后缀的文件都是二进制文件,如果想要打开或修改这些文件,必须通过特定软件进行,比如用Photoshop软件可以编辑图像文件。从本质上讲,文本文件也是二进制文件,因为计算机处理的全是二进制数据。文件操作通常需要经过3个步骤:打开文件、读或写数据、关闭文件。
(1)打开文件
对文件所有的操作都是在打开文件之后进行的,打开文件使用open()函数来实现。
open(file[, mode = ‘r’ [,…]])
该函数返回一个文件对象,通过它可以对文件进行各种操作,参数列表中参数的说明如表所示。
Python中打开文件的模式有多种,具体如表所示。
在表中,'r’表示从文件中读取数据,'w‘表示向文件中写入数据,'a‘表示向文件中追加数据,'+’可以与以上3种模式(‘r’、‘w’、‘a’)配合使用,表示同时允许读和写。另外,当需要处理二进制文件时,则需要提供’b’给mode参数,例如’rb’用于读取二进制文件。
(2)关闭文件
当对文件内容操作完以后,一定要关闭文件,这样才能保证所修改的数据保存到文件中,同时也可以释放内存资源供其他程序使用。
文件对象名.close()
此处需注意,即使使用了close()方法,也无法保证文件一定能够正常关闭。例如,在打开文件之后和关闭文件之前发生了错误导致程序崩溃,这时文件就无法正常关闭。因此,在管理文件对象时推荐使用with关键字,可以有效地避免这个问题,具体示例如下:
with open(‘test.txt’, ‘r+’) as f:
使用with-as语句后,就不需要再显式使用close()方法。另外with-as语句还可以打开多个文件,具体示例如下:
with open(‘test1.txt’, ‘r+’) as f1, open(‘test2.txt’, ‘a+’) as f2:
从上述示例中可看出,with-as语句极大地简化了文件打开与关闭操作,这对保持代码的优雅性有极大的帮助。
(3)读取文件
打开文件成功后将返回一个文本对象,对文件内容的读取可以通过该对象来实现,该对象有3种方法可以获取文件内容,具体如下所示:
•read()方法
read()方法可以从文件中读取内容,其语法格式如下:
文件对象.read([size])
该方法表示从文件中读取size个字节或字符作为结果返回,如果省略size,则表示读取所有内容。
•readlines()方法
readlines()方法可以读取文件中的所有行,其语法格式如下:
文件对象.readlines()
该方法将文件中的每行内容作为一个字符串存入列表中并返回该列表。此处需注意,readlines()方法一次性读取文件中的所有行,如果文件非常大,使用readlines()方法就会占用大量的内存空间,读取的过程也较长,因此不建议对大文件使用该方法。
•readline()方法
readline()方法可以逐行读取文件的内容,其语法格式如下:
文件对象.readline()
该方法将从文件中读取一行内容作为结果返回。
3. in关键字除了上述几种方法外,还可以通过in关键字读取文件,如例所示。
<1>with open(‘test.txt’) as f:
<2>for line in f:
<3>print(line, end = ‘’)123
4.写文本文件
文件中写入内容也是通过文件对象来完成,可以使用write()方法或writelines()方法来实现。•write()方法
write()方法可以实现向文件中写入内容,其语法格式如下:
文件对象.write(s)
该方法表示将字符串s写入文件中。•writelines()
方法writelines()方法向文件中写入字符串列表,其语法格式如下:
文件对象.writelines(s)
该方法将列表s中的每个字符串元素写入文件中。
5.读写二进制文件
文本文件使用字符序列来存储数据,而二进制文件使用字节序列存储数据,它只能被特定的读取器读取。
Python中pickle模块可以将数据序列化。序列化是指将对象转化成一系列字节存储到文件中,而反序列化是指程序从文件中读取信息并用来重构上一次保存的对象。
pickle模块中dump()函数可以实现序列化操作,其语法格式如下:
dump(obj, file, [,protocol = 0])
该函数表示将对象obj保存到文件file中,参数protocol是序列化模式,默认值为0,表示以文本的形式序列化,protocol的值还可以是1或2,表示以二进制的形式序列化。
pickle模块中load ()函数可以实现反序列化操作,其语法格式如下:
load(file)
该函数表示从文件file中读取一个字符串,并将它重构为原来的python对象。
接下来演示使用pickle模块实现序列化和反序列化操作,如例所示。
1 import pickle # 导入 pickle 模块
2 data1 = {‘小千’: [18, ‘女’, 100]
3 ‘小锋’: [19, ‘男’, 98.5]
4 ‘小扣’: [18, ‘男’, 60] }
5 data2 = [‘千锋教育’, ‘扣丁学堂’, ‘好程序特训营’]
6 with open(‘test.dat’, ‘wb’) as f1:
7 pickle.dump(data1, f1) # 将字典序列化
8 pickle.dump(data2, f1, 1) # 将列表序列化
9 with open(‘test.dat’, ‘rb’) as f2:
10 data3 = pickle.load(f2) # 重构字典
11 data4 = pickle.load(f2) # 重构列表
12 print(data3, data4)
6.定位读写位置
件指针是指向一个文件的指针变量,用于标识当前读写文件的位置,通过文件指针就可对它所指的文件进行各种操作。
•tell()方法可以获取文件指针的位置,其语法格式如下:
文件对象.tell()
该方法返回一个整数,表示文件指针的位置。•seek()方法可以移动文件指针位置,其语法格式如下:
文件对象.seek((offset[, where = 0]))
其中,参数offset表示移动的偏移量,单位为字节,其值为正数时,文件指针向文件尾方向移动;其值为负数时,文件指针向文件头方向移动。参数where指定从何处开始移动,其值可以为0、1、2,具体含义如下所示:0——表示文件头。 1——表示当前位置。 2——表示文件尾复制文件在日常生活中,经常需要将文件从一个路径下复制到另一个路径下。
•在Python中,shutil模块的copy()函数可以实现复制文件,其语法格式如下:
shutil.copy(src, dst)
该函数表示将文件src复制为dst,如例所示。
1 import shutil # 导入 shutil 模块
2 shutil.copy(‘D:/1000phone/test.txt’, ‘copytest.txt’)程序运行结束后,在目录“D:/1000phone/”会生成一个copytest.txt文件。移动文件在日常生活中,经常需要将文件从一个路径下移动到另一个路径下。
•在Python中,shutil模块的move ()函数可以实现移动文件,其语法格式如下:shutil.move(src, dst)
该函数表示将文件src移动到dst,如例所示。
1 import shutil # 导入 shutil 模块
2 shutil.move(‘D:/1000phone/copytest.txt’, ‘…/copytest.txt’)
程序运行结束后,文件copytest.txt从目录“D:/1000phone/”移动到目录“D:/”。
重命名文件在Python中,os模块的rename()函数可以重命名文件,其语法格式如下:•os.rename(src, dst)
该函数表示将src重名为dst,如例所示。
1 import os # 导入 os 模块
2 os.rename(‘D:/copytest.txt’, ‘D:/copytest1.txt’)12程序运行结束后,文件copytest.txt被重名为“copytest1.txt”。
删除文件在Python中,os模块的remove ()函数可以删除文件,其语法格式如下:•os.remove(src)
该函数表示将文件src删除,如例所示。
1 import os # 导入 os 模块
2 os.remove(‘D:/copytest1.txt’)
程序运行结束后,文件copytest1.txt被删除。目录操作
在开发中,随着文件数量的增多,就需要创建目录来管理文件,有关文件目录的操作,该操作需要导入os模块。
•创建目录os模块的mkdir()函数可以创建目录,其语法格式如下:
os.mkdir(path)
path指定要创建的目录,如例所示。
1 import os # 导入 os 模块
2 os.mkdir(‘D:/1000phone/codingke’)
程序运行结束后,在目录D:/1000phone/下创建出一个目录codingke。此处需注意,该函数只能创建一级目录,如果需要创建多级目录,则可以使用makedirs()函数,其语法格式如下:os.makedirs(path1/path2…)
参数path1与path2形成多级目录,具体示例如下:import os # 导入 os 模块os.makedirs(‘D:/1000phone/goodprogrammer/test’)程序运行结束后,目录结构为D:/1000phone/goodprogrammer/test。
获取目录
os模块的getcwd()函数可以获取当前目录,其语法格式如下:
os.getcwd()
另外,os模块的listdir()函数可以获取指定目录中包含的文件名与目录名,其语法格式如下:os.listdir(path)
其中,参数path指定要获取目录的路径,如例所示。
1 import os # 导入 os 模块
2 res = os.listdir(‘D:/1000phone’)3 print(res)123
7.遍历目录
如果希望查看指定路径下全部子目录的所有目录和文件信息,就需要进行目录的遍历,os模块的walk()函数可以遍历目录树,其语法格式如下:
os.walk(树状结构文件夹名称)
该函数返回一个由3个元组类型的元素组成的列表,具体如下所示:
[(当前目录列表), (子目录列表), (文件列表)]
8.删除目录
删除目录可以通过以下两个函数,具体如下所示:
os.rmdir(path) # 只能删除空目录shutil.rmtree(path) # 空目录、有内容的目录都可以删除
接下来演示这两个函数的使用,如例所示。
1 import os, shutil # 导入 os、shutil 模块
2 os.rmdir(‘D:/1000phone/codingke’)
3shutil.rmtree(‘D:/1000phone/goodprogrammer’)
程序运行结束后, D:/1000phone/codingke空目录被删除,D:/1000phone/goodprogrammer目录及目录下内容被删除。