文件操作的常用方法
1、打开文件
1.os.mknod("test.txt") #创建空文件
2.f = open("test.txt",w) #直接打开一个文件,如果文件不存在则创建文件
3.关于open 模式:
w:以写方式打开,
a:以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+:以读写模式打开
w+:以读写模式打开 (参见 w )
a+:以读写模式打开 (参见 a )
rb:以二进制读模式打开
wb:以二进制写模式打开 (参见 w )
ab:以二进制追加模式打开 (参见 a )
rb+:以二进制读写模式打开 (参见 r+ )
wb+:以二进制读写模式打开 (参见 w+ )
ab+:以二进制读写模式打开 (参见 a+ )
a:以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+:以读写模式打开
w+:以读写模式打开 (参见 w )
a+:以读写模式打开 (参见 a )
rb:以二进制读模式打开
wb:以二进制写模式打开 (参见 w )
ab:以二进制追加模式打开 (参见 a )
rb+:以二进制读写模式打开 (参见 r+ )
wb+:以二进制读写模式打开 (参见 w+ )
ab+:以二进制读写模式打开 (参见 a+ )
2、读
read 读取整个文件
f = open('doubi.txt', 'r+', encoding='utf-8') data = f.read() print(data) #执行结果为: peiqi.abc123.21.chengguan alex.abc123.24.IT gangniang.abc123.27.dachu
f = open('doubi.txt','r') for line in f: Print(line)
也可以用readline和readlines
readline 只读一行,遇到
or
为止
f = open('doubi.txt', 'r+', encoding='utf-8') data=f.readline() data1=f.readline() data2=f.readline() print(data) print(data1) print(data2) #结果为: peiqi.abc123.21.chengguan alex.abc123.24.IT gangniang.abc123.27.dachu
readlines 读取整个文件到一个迭代器以供我们遍历(读取到一个list中,以供使用,比较方便)
f = open('doubi.txt', 'r+', encoding='utf-8') data=f.readlines() print(data) print(type(data)) #执行结果为: ['peiqi.abc123.21.chengguan ', 'alex.abc123.24.IT ', 'gangniang.abc123.27.dachu '] <class 'list'>
另外需要注意的是read是按字符读取,tell和seek是按照字节 切记否则是坑
tell
1. 作用:获取当前文件读取指针的位置
2. 语法格式: file.tell() 注: 此方法没有参数
seek
1. 作用:用于移动文件读写指针到指定的位置
2. 语法格式:file.seek(offset, whence=0):
--> offset: 偏移量,需要向前或者是向后移动的字节数
--> whence: 可选值,默认为0, 可选值为1或者2,表示从何处开始计算偏移,具体来说,
--> 0表示从当前位置开始计算偏移
--> 1表示从文件头位置开始计算偏移
--> 2表示从文件尾开始计算偏移
f = open('doubi.txt', 'r+', encoding='utf-8') f.seek(3) #表示向前移动3个字节 data = f.tell() #获取当前指针位置 print(data) f.close() #结果为 3 # f.seek(0,0) #表示将文件指针移动到文件头处 # f.tell() # # f.seek(0,2) #表示将文件读取指针移动到文件尾部 # f.tell()
注意seek的长度是按字节算的, 字符编码存每个字符所占的字节长度不一样。
如“你好啊” 用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4) 就把光标切换到了“好”和“啊”两个字中间。
但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了,少了一个字节。
3、写入
close 是关闭文件的时候才进行保存(将数据从内存中写入硬盘)
f = open('doubi.txt', 'r+', encoding='utf-8') f.seek(9) f.write('城') f.close()
flush
把文件从内存buffer里强制刷新到硬盘,多用于循环。
4、其他
readable(self, *args, **kwargs):
判断是否可读
seekable(self, *args, **kwargs)
判断文件是否可进行seek操作
writable(self, *args, **kwargs):
判断文件是否可写
truncate(self, *args, **kwargs):
按指定长度截断文件,类似于删除,从指定位置开始往后删除。
*指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。