Python:文件操作
一、文件打开方式
格式:open(file, mode = 'r', buffering = -1, encoding = None, errors = None, newline = None, closefd = True, open = None)
==>一般常用file、mode两个参数;
#file:被打开文件所在地址 + 文件名;若只有文件名,认为是在当前目录下打开文件(正则执行的.py文件所有文件夹);默认位置为当前;
#mode:文件打开的模式;
#buffering:指定文件缓冲模式及缓冲区的大小;
A、buffering = n,n > 1 :设定缓冲模式为全缓冲,缓冲区大小为n个字节;
B、buffering = 1:设定缓冲模式为行缓冲,遇到换行符 '\n' 时进行系统调用,也就是I/O操作,将数据写入磁盘;
C、buffering = 0:此为无缓冲你模式,只要有数据,就直接进行系统调用,也就是进行I/O操作,将数据写入磁盘;
#系统调用:向操作系统申请一个服务,操作系统响应后,帮助调用硬件的驱动程序,这种操作也称为I/O操作;
(可参考:问题22:如何设置文件的缓冲)
模式 | 执行操作 |
‘r’ | 以只读方式打开文件(默认);#若文件不存在,报异常,不新建; |
‘w’ | 以写入的方式创建新文件;#若文件名存在,将其覆盖; |
‘x’ | 新建文件;#如果文件存在,引发异常; |
‘a’ | 以写入方式打开文件;#若文件存在,可在文件后追加内容;若文件不存在,新建文件; |
‘b’ | 以二进制模式打开文件;#如‘rb’、‘wb’、‘ab’、‘xb’等; |
‘t’ | 以文本模式打开文件(默认); |
‘+’ | k可读写模式;(添加到其它模式中使用) |
‘U’ | 通用换行符支持 |
f = open('test.txt', 'w') s = '这小伙真帅' f.write(s) f.close f = open('test.txt') print(type(f)) #输出:<class '_io.TextIOWrapper'> #_io.TextIOWrapper:是什么意思? print(list(f)) #输出:['这小伙真帅']
二、文件对象的方法
文件对象的方法 | 执行操作 | 语法格式 |
close() | 关闭文件; | f.close() |
read(size = -1) |
从文件中读取size个字符(不是字节),若未给定size值或给负值时, 读取剩余的(从文件指针位置)所有字节然后做为字符串返回; |
f.read(n): 从指针位置起,读取n个字节 |
readline() | 从文件指针位置开始,读取一整行字符串;#一整行:以换行符 ‘\n’ 来分行; | f.read() |
write(str) | 将字符串写入文件; #所写入的数据必须是字符串; | f.write('字符串') |
writelines(sep) | 向文件写入字符串序列sep;#sep是一个返回字符串的可迭代对象,不是字符串本身; | f.writelines(字符串的可迭代对象) |
seek(offset, from) |
移动文件指针;#从offset(0/1/2)处,偏移from个字节; #0代表文件起始位置;1代表指针当前位置;2代表文件末尾; #from为具体的正整数; |
f.seek(1, size): #从当前指针位置移动size个字节; |
tell() | 返回指针当前位置;#结果为正整数,表示指针距离文件起始位置的字节数; | f.tell() |
#文件指针:相当于一个‘书签’,对文件进行引索、读取、写入时,从指针位置开始操作;
#一个字符是1个字节;一个汉字是2个字节;
#文件本身可以看做是一个字符串,读取文件时,返回文件对象,可以被迭代操作,与字符串迭代操作一样;
f = open('test.txt', 'w') for i in f: print(i) #输出:这小伙真帅
三、python文件系统方法
1)OS模块中关于文件/目录常的函数
#对于文件系统的访问,Python一般通过OS模块来实现;
#Python是夸平台的语言:同样的源代码在不同的操作系统上执行时,不需要修改;
#OS:系统模块;(Operating System)
#使用OS模块下的方法前,先导入OS模块:import os
OS模块中关于文件/目录常的函数
函数名 | 功能 | 语法格式 |
getcwd() | 返回当前工作目录;#即当前工作的物理地址 | os.getcwd() |
chdir(path) | 改变工作目录;#path指代需要切换到的目录 | os.chdir(path) |
listdir(path = '.') |
l列举指定目录中的文件名(包含文件夹的名字),其中文件名带格式(如'.py'、'.txt'),以['str1', 'str2']形式返回; #'.':表示当前工作目录,也是默认值; #'..':表示工作目录的上一层目录; #path指定具体地址,如('E:\pythonwj'):返回指定地址下的文件名; |
os.listdir(path = '.') |
mkdir() | 在当前工作目录下,创建单个文件夹(不是文件);#如果文件夹已存在,抛出异常; | os.mkdir() |
makedirs(path) |
在指定目录下,创建多层文件夹;#如果文件夹已存在,抛出异常; #例1:os.makedirs(r'.\a\b\c'):a在当前工作目录下,b在a文件夹下,c在b文件夹下; #r'.\a\b\c':要加r,表示原始字符串;若在当前工作目录下创建,要加 '.\' ; #例2:os.makedirs(r'E:\pythonwj\a\b\c') |
os.makedirs(path) |
remove(path) | 删除当前工作目录下指定的文件;#不是文件夹 | os.remove(path) |
rmdir(path) | 删除当前工作目录下指定的单层文件夹;#文件下不在有其它文件; | os.rmdir(path) |
removedirs(path) |
删除当前工作目录下指定的多层文件;#连同文件夹下的其它文件夹同时删除; #os.removedirs(r'a\b\c'):删除当前工作目录下的a文件夹,以及a文件夹下的b、c文件夹; |
os.removedirs(path) |
rename() |
重命名当前工作目录下的文件夹或文件; #os.rename('文件名1/文件夹名1', '文件名2/文件夹名2'): ==>将当前目录下的文件1/文件夹1,更名为 文件2/文件夹2 |
os.rename(name1,name2) |
system() |
s使用系统的小工具; #例:os.system('calc'):打开系统的计算器; |
os.system('小工具代码') |
walk(top) |
遍历top参数指定路径下的所有子目录,并将结果返回一个三元组(路径, [包含目录], [包含文件]) #top:需要遍历的顶级目录的路径; |
os.walk(top) |
扩展:
os.curdir表示当前目录('.');
os.pardir表示上一级目录('..');
os.sep表示路径的分隔符,比如Windows系统下为‘\\’,Linux系统下为‘/’;
os.linesep表示当前平台使用的行中支符;(Windows下为‘\r\n’,Linux下为‘\n’)
os.name表示当前使用的操作系统;
import os print(os.sep) #输出:\
#walk(top)用法,及与os.path.walk()的区别,参见:Python:os.walk()和os.path.walk()用法
实例:
import os for i in os.walk(r'E:\pythonwj'): print(i) #输出: # ('E:\\pythonwj', ['Chapter_2', 'Chapter_3', 'Chapter_4', 'Chapter_5', 'Chapter_6'], []) # ('E:\\pythonwj\\Chapter_2', [], ['0_0.py', '2_1.py', '2_2.PY', '2_3.py']) # ('E:\\pythonwj\\Chapter_3', [], ['0-0.py', '3-1.py', '3-3-1.py', '3-3-2.py', '3-4.py', '3-5.py']) # ('E:\\pythonwj\\Chapter_4', [], ['0-0.py', '0.py', '00.py', '4-1.py', '4-2.py', '4-4.py', '4-5.py', '4-6.py', 'record.txt', 'test.txt', 'test_1.txt', 'test_2.txt', 'test_3.txt', 'txt'test_2.txt', 'test_3.txt', 'txt.py']) # ('E:\\pythonwj\\Chapter_5', [], []) # ('E:\\pythonwj\\Chapter_6', [], [])
二)os.path模块中关于路径常用的函数
函数名 | 功能及使用方法 |
basename(path) | 去掉目录路径,单独返回文件名 |
dirname(path) | 去掉文件名,单独返回目录路径; |
join(path1[, path2[, ...]]) | 将path1和path2各部分组合成一个路径名;#多用于创建文件时,指定该文件的路径:os.path.join(path, file) |
split(path) |
分割文件名和路径,返回(f_path, f_name)元组; #如果完全使用目录,它也会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在; |
splitext(path) | 分离文件名和扩展名,返回(f_name, f_extension)元组; |
getsize(file) | 返回指定文件的尺寸,单位字节; |
getatime(file) | 返回指定文件最近访问的时间:浮点型秒数;(可用time模块的gmtime()或者localtime()函数换算) |
getctime(file) | 返回指定文件的创建时间:浮点型秒数;(可用time模块的gmtime()或者localtime()函数换算) |
getmtime(file) | 返回指定文件最新的修改时间:浮点型秒数;(可用time模块的gmtime()或者localtime()函数换算) |
扩展:os.path.abspath(path):获取指定文件的路径,不含文件名;
以下函数返回True或False
函数名 | 功能与使用方法 |
exists(path) | 判断指定路径(目录或者文件)是否存在 |
isabs(path) | 判断指定路径是否为绝对路径 |
isdir(path) | 判断指定路径是否存在且是一个目录 |
isfile(path) | 判断指定路径是否存在且是一个文件 |
islink(path) | 判断指定路径是否存在且是一个符号链接 |
ismount(path) | 判断指定路径是否存在且是一个挂载符 |
samefile(path1, path2) | 判断path1和path2两个路径是否指向同一个文件 |
四、pickle模块
1)功能:多用于直接将一个完整的列表、字典、类的实例,存储到文件内;
#当然,它可以保持任何想保存的数据;
2)思路:将列表、字典、类的实例,这些数据,转换成二进制的形式进行存储;
3)格式:
1)pickle.dump(数据, 文件/文件对象):将数据存入文件;
2)my_date = pickle.load(文件/文件对象):读取数据;
4)注意事项:
A、打开文件,要以二进制形式;
B、为便于区分记忆,此类文件后缀,建议使用:.pkl或.pickle;
#此类文件为二进制文件,无法用记事本打开,打开时会显示乱码;