目录:
一、文件对象
二、文本文件
三、二进制文件
四、文件与文件夹操作
一、文件对象
Python内置了文件对象,通过内置函数open()可以以指定模式打开指定文件并创建文件对象,如果正常执行open函数返回的是一个可迭代的文件对象,通过此对象可以对文件进行读写操作。
语法格式: open(file,mode=‘r’,buffering,encoding=None,errors=None,newline=None,closefd=True,opener=None)
file–指定要打开或创建的文件名称,如果文件不在当前目录中需要指定完整路径。
mode–指定文件打开后的处理方式。以r和w打开时指针在文件头,以a打开时指针在文件末尾。打开模式见下表6-1
buffering–指定读写文件的缓存模式,数值0(只在二进制模式中可以用)表示不缓存,数值1(只在文本模式中可以用)表示使用行缓存模式,大于1的数值则表示缓冲区的大小。默认值是-1,当使用默认值时二进制文件和非交互式文本文件以固定大小的块为缓存单位。
encoding–指定对文本文件进行编码和解码的方式,只适用于文本模式,可以使用Python支持的任何格式。详见标准库codecs。
newline–只适用于文本模式,取值可以是None、’’、’\n’、’\r’、’\r\n’中的任何一个,表示文件中新行的形式。
表6-1 文件打开模式
模式 | 说明 |
---|---|
r | 读模式(默认模式,可省略),如果文件不存在则抛出异常 |
w | 写模式,如果文件已经存在,则先清空原有内容再写入 |
x | 写模式,创建新文件写入,如果文件已存在则抛出异常 |
a | 追加模式,不覆盖文件中原有内容 |
b | 二进制模式,可与其他模式组合使用 |
t | 文本模式(默认模式,可省略) |
+ | 读、写模式(可与其他模式组合使用) |
表6-2 文件对象常用属性
属性 | 说明 |
---|---|
closed | 判断文件是否关闭,如果已关闭则返回True |
mode | 返回文件的打开模式 |
name | 返回文件的名称 |
表6-3 文件对象的常用方法
方法 | 功能说明 |
---|---|
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区的内容写入文件,同时关闭文件,释放文件对象 |
read([size]) | 从文件中读取size个字符的内容作为结果返回,如果省略size则表示读取全部内容返回 |
readline() | 从文本文件中读取一行内容作为结果返回 |
readlines() | 把文本文件中的每一行内容作为一个字符串存入列表中,返回该列表 |
seek(offset [ , whence] ) | 把文件指针移到新的位置,offset表示相对于whence的位置。whence为0表示从文件头开始计算,1表示从当前位置开始计算,2表示从文件末尾开始计算,默认为0 |
tell() | 返回文件指针的当前位置 |
truncate([size]) | 删除从当前指针位置到文本末尾的内容,如果指定了size,则不论指针在什么位置都只留下前size个字节,其余的都删除 |
write(s) | 把字符串s的内容写入文本文件中 |
writelines(s) | 把字符串列表写入文本文件中,不添加换行符 |
writable() | 测试当前文件是否可写 |
readable() | 测试当前文件是否可读 |
小提示: 1. 缓存机制的存在使得修改文件时不需要频繁地进行磁盘文件的读写操作,而是等缓存满了之后再写入文件,或者调用flush()方法强行将缓存中的内容写入磁盘文件。2.即使写了文件关闭代码,也无法保证文件一定能够正常关闭。3.文件操作完以后一定要关闭文件对象。
二、文本文件
- 关键字with
文件操作一般遵循:“打开文件–读写文件–关闭文件”的标准流程,但如果执行过程中代码抛出了异常则很难保证文件被正常关闭。关键字with可以自动管理资源,不论因为什么原因跳出了with块都能保证文件被正确关闭,并且能够在代码执行完毕之后自动还原进入该代码块时的现场,常用语文件操作、数据库连接、网络·通信连接等场合。
>>>s='hello world\n'
>>>with open('py.txt','a+') as fp:
fp.write(s) #关键字with不需要书写文件关闭语句
#with管理语句还支持如下用法:
>>>with open('py1.txt','a+') as fp1,open('py2.txt','a+') as fp2:
fp2.write(fp1.read()) #py1中的内容读取写入py2中保存
- 文件对象可迭代
#运用迭代特性读取文本内容
with open('py.txt') as fp:
for line in fp:
print(line)
#也可以通过readlines()方法实现
with open('py.txt') as fp:
lines=fp.readlines()
print(' '.join(lines)) #readlines()方法在操作大文件时不建议使用,会消耗大量的内存资源
三、二进制文件
二进制文件包括数据库文件、图像文件、可执行文件、动态链接库文件、音频文件、视频文件、office文档等,不能直接正常的读写。二进制文件是将内存中的数据序列化(不丢失信息的情况下转换成对应的二进制形式)得到的,序列化后的数据经过正确的反序列化能够准确的恢复为原来的对象。
Python中操作二进制文件常用的序列化模块有:struct、pickle、shelve、marshal、json等。
- 用pickle模块读写二进制文件
dump()方法用于将数据序列化并写入文件;load()方法用于读取二进制文件内容进行反序列化,还原为原来的信息。dumps()方法可以返回对象序列化之后的字节形式。
- dump()方法
pickle.dump(obj, file, protocol)
obj——序列化对象,将对象obj保存到文件file中去;
file——file表示保存到的类文件对象,file必须有write()接口,file可以是一个以’w’打开的文件或者是一个StringIO对象,也可以是任何可以实现write()接口的对象;
protocol——序列化模式,默认是 0(ASCII协议,表示以文本的形式进行序列化),protocol的值还可以是1和2(1和2表示以二进制的形式进行序列化。其中,1是老式的二进制协议;2是新二进制协议)。
- load()方法
pickle.load(file)
反序列化对象,将文件中的数据解析为一个python对象。
file中有read()接口和 readline() 接口
#1.dump()
import pickle
fp=open('py.txt','a+')
i=python
pickle.dump(i,fp) #fp是文件,i为写入内容可以是整数、实数、字符串、列表、元组集合、字典等
#2.load()
result = pickle.load(fp)
print(result) # 结果:python
#3.dumps()
>>>pickle.dumps([1,2,3])
b'\x80\x03]q\x00(K\x01K\x02K\x03e.' #序列化列表,返回序列化后的字节形式
- 用struct模块读写二进制文件
时候用struct模块需要用pack()方法把对象按指定个数进行序列化,然后用write()方法将序列化的结果写入二进制文件;读取时需要用read()方法读取然后用struct模块的unpack()方法反序列化得到原来的信息。
Python中struct.pack()和struct.unpack()用法详细说明 - 用shelve模块读写二进制文件
Python标准库shelve也提供了二进制文件操作的功能,可以像字典一样写入二进制文件也可以像字典一样读取二进制文件。
Python编程——shelve模块的使用详解(附实例) - 用marshal模块读写二进制文件
marshal模块和pickle模块类似也可以通过dump()和load()方法进行对象的序列化和反序列化。
python_使用marshal模块序列化
四、文件与文件夹操作
- 标准库os、os.path与shutil简介
表6-4 os模块常用成员
方法 | 功能说明 |
---|---|
access(path,mode) | 按照mode指定的权限访问文件 |
chdir(path) | 把path设为当前工作目录 |
chmod(path,mode,*,dir_fd=None,follow_symlinks=True) | 改变文件的访问权限 |
extsep | 当前操作系统所使用的文件扩展名分隔符 |
fstat(path) | 返回打开的文件的所有属性 |
get_exec_path( ) | 返回可执行文件的搜索路径 |
getcwd( ) | 返回当前工作目录 |
listdir(path) | 返回path目录下的文件和目录列表 |
mkdir(path [, mode=0777]) | 创建目录 |
makedirs(path1/path2… , mode=511) | 创建多级目录 |
open(path,flags,mode=0o777,*,dir_fd=None) | 按照mdoe指定的权限打开文加你,默认权限为可读、可写、可执行 |
rmdir(path) | 删除目录,目录中不能有文件或子文件夹 |
remove(path) | 删除指定文件 |
removedirs(path1/path2…) | 删除多级目录,目录中不能有文件 |
rename(src,dst) | 重命名文件或目录,可实现文件的移动 |
scandir(path=’.’) | 返回包含指定文件夹中所有DirEntry对象的迭代对象 |
sep | 当前参做系统所使用的路径分隔符 |
startfile(filepath[,operation]) | 使用关联的应用程序打开指定文件或启动指定应用程序 |
stat(path) | 返回文件的所有属性 |
truncate(path,length) | 将文件截断,只保留指定长度的内容 |
walk(top,topdown=True,οnerrοr=None) | 遍历目录树,该方法返回一个元组,包括三个元素:所有路径名、所有目录列表与文件列表 |
write(fd,data) | 将bytes对象data写入文件fd |
表6-5 os.path模块常用成员
方法 | 功能说明 |
---|---|
abspath(path) | 返回给定路径的绝对路径 |
basename(path) | 返回指定路径的最后一个组成部分 |
commonpath(paths) | 返回给定多个路径的最长公共路径 |
commonprefix(paths) | 返回给定多个路径的最长公共前缀 |
dirname(p) | 返回给定路径的文件夹部分 |
exists(path) | 判断文件是否存在 |
getatime(filename) | 返回文件的最后访问时间 |
getctime(filename) | 返回文件的创建时间 |
getmtime(filename) | 返回文件的最后修改时间 |
getsize(filename) | 返回文件的大小 |
isabs(path) | 判断path是否为绝对路径 |
isdir(path) | 判断path是否为文件夹 |
isfile(path) | 判断path是否为文加你 |
join(path,*paths ) | 连接两个或多个path |
split(path) | 对路径进行分隔以列表形式返回 |
splitext(path) | 从路径中分割文件的扩展名 |
splitdrive(path) | 从路径中分隔驱动器的名称 |
表6-6 shutil模块常用成员
方法 | 功能说明 |
---|---|
copyfile(src,dst) | 复制文件 |
copytree(src,dst) | 递归复制文件夹 |
disk_usage(path) | 查看磁盘使用情况 |
move(src,dst) | 移动文件或递归移动文件夹 |
rmtree()path | 递归删除文件夹 |
make_archive(base_name,format,root_dir=None,base_dir=None) | 创建tar或zip格式的压缩文件 |
unpack_archive(filename,extract_dir=None,format=None) | 解压缩文件 |
猜你喜欢:
(三)Python语法基础之程序控制结构与函数设计(条件表达式、选择结构、循环结构、函数)
(二)Python语法基础之字符串及其格式化方法(%-format、format、f-string)
(一)Python语法基础之列表、元组、字典、集合
注:感谢清华大学董付国老师及其编著的《Python可以这样学》,部分代码和知识点源于此!