Python 文件操作
使用os模块操作文件本身
函数 |
描述 |
os.unlink(filepath) |
删除文件 |
os.remove(filepath) |
同上 |
os.rmdir(dirpath) |
删除文件夹,必须要是空文件夹才能删除 |
os.removedirs(dirpath) |
同上 |
|
|
os.rename(oldpath,newpath) |
重命名文件、文件夹。要求2个路径只有文件名部分不同,其余要相同。若目标已存在,会报错。 |
os.renames(oldpath,newpath) |
同上 |
os.mkdir(dirpath) |
创建文件夹。如果文件夹已存在,会报错;如果前面的路径不存在,会报错。 |
os.makedirs(dirpath) |
递归创建文件夹。如果前面的路径不存在,会自动创建。 |
os.listdir(dirpath) |
列出该文件夹下的所有子文件夹,以列表形式返回。只列出子文件夹,不会列出文件、后代文件夹。可用于遍历。 |
|
|
os.chdir(dirpath) |
切换到指定目录 |
os.getcwd() |
获取当前目录(注意是目录)的绝对路径。 如果之前用chdir()切换了路径,此函数得到的是目标路径。 |
os.path.getsize(filepath) |
返回文件大小(字节数) |
os.path.exists(path) |
检测文件|文件夹是否存在,返回bool值。 这2个方法是path子模块的方法。 |
没有新建文件的方法,但可以通过打开文件来新建文件:打开文件时指定打开模式是 文件不存在时自动创建的模式,这样就能新建文件了。
path均为路径,字符串形式。
使用os模块实现文件读写
函数 |
描述 |
os.open(filepath,mode) |
打开文件,返回文件描述符(常用fd表示)。常用的mode:
|
os.fdopen(fd, [, mode[, bufsize]]); |
此方法是内置函数open() 的别名。 mode -- 可选,和 python 内置的 open()函数的mode参数一样,可以是r,w,a,r+,w+,a+... bufsize -- 可选,指定返回的文件对象是否带缓冲:bufsize=0,表示没有带缓冲;bufsize=1,表示该文件对象是行缓冲的;bufsize=正数,表示使用一个指定大小的缓冲冲,单位为byte,但是这个大小不是精确的;bufsize=负数,表示使用一个系统默认大小的缓冲,缺省时使用系统默认大小的缓冲。 |
os.read(fd,n) |
fd:文件描述符,n:最多读取的字节数 返回读取到的字符串 |
os.write(fd, bytes) |
写入一个字符串。返回实际写入字符串的长度。 要以字节、字节数组的形式写入。 示例:bytes("ok","utf-8") 将字符串转换为字节 |
os.lseek(fd, pos, how) |
设置文件指针的当前位置。 第三个参数是参考点,seek_set 或 0 表示文件头; seek_cur或 1 表示当前位置; os.seek_end或2表示文件尾。 第二个参数制定相对参考点的偏移量 |
os.close(fd) |
关闭文件 |
写入示例:
import os fd=os.open("1.txt",os.o_rdwr) os.write(fd,bytes("hello\nworld","utf-8")) os.close(fd)
读取示例:
import os fd=os.open("1.txt",os.o_rdwr) bytes=os.read(fd,1024) #返回的是字节形式 print(bytes.decode("utf-8")) #解码,将读取到的字节转换为字符串 os.close(fd)
使用python的内置函数实现文件读写
使用open()函数打开文件,创建文件对象
f=open(file[, mode])
mode常用的值:
模式 | 描述 |
---|---|
r |
只读。缺省mode时默认为r。以r开头的:指针放在文件头,若文件不存在,会报错。 |
rb |
只读,打开二进制文件。 |
r+ |
读写 |
rb+ |
读写,打开二进制文件 |
w |
只写。以w开头的:指针放在文件头,如果文件不存在,会自动创建。 |
wb |
只写,打开二进制文件 |
w+ |
读写 |
wb+ |
读写,打开二进制文件 |
a |
追加。以a开头的:指针放在文件尾,如果文件不存在,会自动创建。 |
ab |
追加,打开二进制文件 |
a+ |
追加,可读写。 |
ab+ |
追加,可读写,打开二进制文件 |
写不是先清空原有内容,再写入,而是直接覆盖。
比如原来的内容是“hello wolrd”,写入一个“ok”,变为“okllo world”。
写入的内容比原来的长,才会覆盖完。
file 对象
使用open()打开文件后,会返回一个file对象,表示文件本身。 file 对象常用的方法:
函数 | 描述 |
---|---|
file.flush() |
把内部缓冲区的数据立刻写入文件 |
file.close() |
关闭文件 |
file.read([size]) |
读取指定的字节数,缺省size或size为负数时,会读取所有内容。 如果是文本文件,返回读取的字符串(如果读取到的是空串,说明已到文件尾);如果是二进制文件,返回读取到的字节。 |
file.readline() |
读取一行,以字符串(如果读取到的是空串,说明已到文件尾)或字节形式返回。 |
file.readlines() |
读取所有行,以字符串列表或字节列表形式返回。 |
file.write(str) |
写入一个字符串,返回实际写入的字符数(注意是字符数) |
file.writelines(list|tuple) |
写入一个字符串列表|元组,元素必须是字符串。 写完一个元素后,会在后面接着写,不会自动换行。如果要换行,需要自己加"\n" |
file.tell() |
返回文件指针的当前位置(从文件头开始的字节数) |
file.seek(offset[, whence]) |
设置文件指针的当前位置。 offset表示偏移量,int型,默认以字符为单位。 whence表示参考点,有3个可用的值: 0 文件头 1 当前位置(默认) 2 文件尾 |
读|写的时候,文件指针会自动后移。
如果以文本文件的方式打开(不带b),则读取时返回字符串|字符串列表,写入时只能写入字符串。
如果以二进制的形式打开(带b),则读取时返回字节,写入时可以写入任何类型(底层都是字节)。
读取示例:
f=open("1.txt","r+") #str=f.read(1024) #读指定的字节数 #str=f.readline() #读一行 str=f.readlines() #全读完,作为列表返回,一行一个元素 print(str) f.close()
写入示例:
f=open("1.txt","r+") f.write("hello") #从头开始覆盖(不是先清空原有内容,再写入,是直接从头开始写,可能覆盖不完) f.close()
pickle 模块
pickle模块可以实现数据的序列化和反序列化。
1、序列化:将数据存储到文件中
pickle.dump(对象|变量|值, 文件对象)
import pickle file=open("1.txt","wb") str="hello" list=[1,2,3] pickle.dump("ok",file) pickle.dump(str,file) #可同时序列化多个数据 pickle.dump(1,file) #需要以二进制形式打开文件。以文本文件形式打开,只能写入字符串类型,不能写入其他类型。 pickle.dump(list,file) file.close()
2、反序列化:从文件中读取数据,将数据还原
x = pickle.load(文件对象)
import pickle file=open("1.txt","rb") #如果只有字符串,可以以文本文件形式打开;如果有其他类型的,就必须以二进制形式打开,否则反序列化会出错 a=pickle.load(file) b=pickle.load(file) c=pickle.load(file) d=pickle.load(file) print(a,b,c,d) #ok hello 1 [1, 2, 3] 反序列化的顺序和序列化的顺序一致 file.close()