基本文件操作
创建和打开文件
进行文件操作时需要以管理员身份进入编程环境。
file=open(filename,mode,buffering)
file:被创建的文件对象
filename:要创建或打开的文件名称
mode:可选参数,用于指定文件的打开模式
buffering:可选参数,用于指定读写文件的缓冲模式。0表示表达式不缓存,1表示表达式缓存,如果大于1表示缓冲区的大小,默认为缓存模式。
例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190724150331276.png)
-
打开一个不存在的文件时需要先创建该文件
在默认情况下,用open()打开一个不存在的函数,会抛出异常,要解决此问题有两种方法:
手动创建一个文件;
或调用open()函数时,指定mode的参数值为w、w+、a、a+。
-
以二进制形式打开文件
-
使用open()函数不仅可以以文本的形式打开文本文件,而且可以以 二进制形式打开非文本文件,如图片、音频、视频文件等。
以二进制方式打开文件并输出创建对象的代码如下:file=open('picture.png','rb')
mode:
rb:以二进制格式打开文件,采用只读模式,文件的指针会放在文件的开头。
rb+:以二进制格式打开文件,采用读写模式,文件的指针会放在文件的开头。
wb:以二进制格式打开文件,采用只写模式,一般用于非文本文件。
wb+:以二进制格式打开文件,采用读写模式,一般用于非文本文件。
ab:以二进制格式打开文件,采用追加模式,若文件已存在,文件指针放在文件末 尾,否则,创建新文件用于写入。
ab+:以二进制格式打开文件,采用追加模式。 -
打开文件时指定编码方式
在使用open()函数打开文件时,默认采用GBK编码,当被打开的文件不是GBK时,将抛出异常。解决该问题的方法有两种:
一是直接修改文件的编码;
二是在打开文件时,直接指定使用的编码方式,例:file=open('f.txt','r',encoding='utf-8')
关闭文件
关闭文件可以使用文件对象的close()函数:
file.close()
with语句
为了避免打开文件后忘记关闭和打开文件时抛出异常导致文件不能及时被关闭带来的问题,可以使用with语句,从而实现在处理文件时,无论是否抛出异常,都能保证with语句执行完毕关闭已经打开的文件。
with open('message.txt','w')as file:
pass
写入文件内容
可以通过write()方法向文件中写入内容,格式为:
file.write(string)
例:
上述代码已将abcdefg字符串写入文件,返回值为字符长度。
注:
- 调用write()函数的前提是,打开文件时指定的打开模式为w(可写)或a(追加),否则抛出异常。
- 使用with()语句时,应在with()方法中添加write()函数。不应执行完with()方法再添加write()方法,因为执行完with()语句后,文件已被关闭:
读取文件
-
读取指定字符
可以通过read()方法读取指定字符,read()方法从文件开头读取读取字符个数可以指定:file.read([size])
例:
注:调用read()方法读取文件内容的前提是,打开文件时,指定的打开模式为r(只读)或r+(读写),否则抛出异常。如果想从文件中部开始读取,可以使用seek()方法+read()方法,关于seek()函数:
file.seek(offset,whence)
offset:用于指定移动的字符个数
whence:用于指定从什么位置开始计算,值为0表示从键盘开头开始计算,值为1表示从当前位置开始计算,值为2表示从文件末尾开始计算。默认值为0。例:
with open('f:/f.txt','r')as file: file.seek(3) #移动文件指针到新的位置 string=file.read(2) #读取2个字符 print(string)
文件内容为"abcdefg",输出结果:
-
读取一行
使用readline()方法读取一行数据,与read()函数一样,打开文件时的打开模式为r或r+,格式如下:file.readline()
例:g.txt文件中的内容为
读取一行内容:
通过readline()方法读取文件全部内容:
-
读取全部行
通过readlines()方法读取全部行,返回的是一个字符串列表,格式:file.readlines()
例:
目录操作
目录也称文件夹,通过目录可以分门别类地存放文件。在Python中并没有直接操作目录的函数或者对象,而是需要使用内置的os和os.path模块实现。
os和os.path模块
os和os.path模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句执行结果通常与操作系统有关,在不同的操作系统上运行可能会得到不同的结果。
在使用os或os.path模块时需要先导入:import os
导入os模块后,可以使用该模块它提供的通用变量获取与系统有关的信息。常用变量有以下几个:
- name:用于获取操作系统类型
若输出结果为nt,则表示是windows操作系统;如果是posix,则表示是Linux,Unix或 Mac OS系统。 - linesep:用于获取当前操作系统上的换行符。
os函数还提供了一些操作目录的函数:
- os.listdir():返回指定目录下的所有文件和目录名
- os.remove(file):删除一个文件
- os.stat(file):获得文件属性
- os.chmod(file):修改文件权限和时间戳
- os.mkdir(name):创建目录
- os.rmdir(name):删除目录
- os.removedirs(r“c:\python”):删除多个目录
- os.system():运行shell命令
- os.exit():终止当前进程
- os.linesep:给出当前平台的行终止符。例如,Windows使用’\r\n’,Linux使用’\n’而Mac使用’\r’
- os.path.split():返回一个路径的目录名和文件名
- os.path.isfile()和os.path.isdir()分别检验给出的路径是一个目录还是文件
- os.path.existe():检验给出的路径是否真的存在
- os.listdir(dirname):列出dirname下的目录和文件
- os.getcwd():获得当前工作目录
- os.curdir:返回当前目录(’.’)
- os.chdir(dirname):改变工作目录到dirname
- os.path.isdir(name):判断name是不是目录,不是目录就返回false
- os.path.isfile(name):判断name这个文件是否存在,不存在返回false
- os.path.exists(name):判断是否存在文件或目录name
- os.path.getsize(name):或得文件大小,如果name是目录返回0L
- os.path.abspath(name):获得绝对路径
- os.path.isabs():判断是否为绝对路径
- os.path.normpath(path):规范path字符串形式
- os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)
- os.path.splitext():分离文件名和扩展名
- os.path.join(path,name):连接目录与文件名或目录
- os.path.basename(path):返回文件名
- os.path.dirname(path):返回文件路径
路径
-
相对路径
相对路径是依赖于当前工作目录的。当前工作目录是指当前文件所在目录,可以通过os模块的getcwd()函数获取:
如果在当前目录下,有一个名为message.txt的文件,那么在打开这个文件时就可以直接写上文件名,这时采用的是相对路径。如果在当前目录下,有一个子目录demo,并且在该子目录下保存着文件message.txt,那么打开这个文件时可以直接写"demo/message.txt"。
注:指定文件路径时需要对路径分隔符进行转义,用“//”代替“/”或在字符串前加r。 -
绝对路径
是指在使用文件时指定文件的实际路径,它不依赖于当前工作目录。
要获取相对路径的绝对路径,可以使用abspath()函数:
-
拼接路径
如果要将两个或多个路径拼接到一起组成一个新的路径,可以使用os.path模块提供的join()函数实现,格式为:os.path.join(path1,path2,…),例:os.path.join("C:/Python","demo/message.txt")
此函数不会检测路径是否真实存在,若拼接过程中存在多个绝对路径
,以最后一次出现的为准。
判断目录是否存在
通过os.path模块下的exists():
exists()函数除了判断目录是否存在外,还能判断文件是否存在。
创建目录
- 创建一级目录
通过os模块下的mkdir()函数:
os.mkdir("C://demo")
如果在创建时,demo目录已经存在了,将抛出异常。
- 创建多级目录
使用os模块下的makedirs()函数:os.makedirs("C://demo//test//sir//mr")
删除目录
使用os模块下的rmdir()函数:
os.rmdir("C://demo//de//d")
上述代码删除了C:/demo/de目录下的d文件夹。
rmdir()函数只能删除空的目录,如果想要删除非空目录,需要使用shutil模块下的rmtree()函数实现:
import shutil
shutil.rmtree("C://demo//test")
遍历目录
使用os模块下的wallk()函数,例:
遍历此文件夹:
高级文件操作
删除文件
通过os模块下的remove()函数,例:删除F文件夹下的g文件
os.remove("F://g.txt")
若当前目录下不存在该文件,将抛出异常。
重命名文件和目录
通过os模块下的rename()函数,例:将F目录下的f.txt文件更名为z.txt
os.rename("F://f.txt","F://z.txt")
获取文件基本信息
通过os模块下的stat()函数可以获取文件的基本信息:
属性解读:
也可以获取文件的某个信息: