文件操作总结
目录
fileObject.seek(offset,whence)
文件操作模式
模式 | 描述 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式 |
r+ | 打开一个文件用于读写,文件指针将会放在文件的开头 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖;如果该文件不存在,则创建该文件 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖;如果该文件不存在,则创建该文件 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖;如果该文件不存在,则创建该文件 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖;如果该文件不存在,则创建该文件 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。新的内容将会被写入到已有内容之后,如果该文件不存在,创建该文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式,如果该文件不存在,创建该文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。新的内容将会被写入到已有内容之后,如果该文件不存在,创建该文件进行写入。 |
ab+ | 以二进制格式打开一个文件用于追加读写。如果该文件已存在,文件指针将会放在文件的结尾。新的内容将会被写入到已有内容之后,如果该文件不存在,创建该文件进行写入。 |
文件打开操作
open()函数
用来打开一个文件,创建一个file对象,然后就可以对该打开的文件做任何想做的操作;
常用格式为:
file_object=open(file_name,access_model,encoding)
参数说明:
file_name:要访问的文件名称的字符串值;
access_model:文件操作模式,参照上表;默认文件模式为只读r;
encoding:编码或者解码方式
#代码示例
fp=open("test.txt")
content=fp.read()
fp.close() #close()关闭要与open()一定要同时使用
print (content)
with方式打开文件:会默认关闭文件
原理:内部会先执行__enter__方法,执行完毕后再执行__exit__方法
#代码示例
with open("test.txt","r") as fp:
for line in fp:
print (line)
文件读写操作
fileObject.read([size])
size 为读取的长度,以byte为单位,如果不指定参数,表示一次性读取全部内容,以字符串形式返回,并且每一行结尾会有一个"\n"符号。
代码示例:
>>> fp=open("test.txt")
>>> fp.read()
'hello world!\ngloryroad\n每天进步一点点'
>>> fp.close()
>>> fp=open("test.txt")
>>> fp.read(5)
'hello'
>>> fp.close()
fileObject.readline([size])
读取一行,如果给定了size,有可能返回的只是一行的一部分,以字符串的形式返回,并且结尾会有一个换行符"\n"。文件操作标记移动到下一行的开头
代码示例:
>>> fp=open("test.txt")
>>> fp.readline()
'hello world!\n'
>>> fp.readline()
'gloryroad\n'
>>> fp.close()
>>> fp=open("test.txt")
>>> fp.readline(5)
'hello'
>>> fp.readline(5)
' worl'
>>> fp.readline(5)
'd!\n'
>>> fp.close()
fileObject.readlines([size])
把文件每一行作为一个list的成员,是一个字符串,并且结尾会有一个换行符"\n",并返回一个list。如果指定了size参数,表示读取文件指定内容的长度,此时就有可能只能读取文件的一部分,并且结尾会有一个换行符"\n"
代码示例:
>>> fp=open("test.txt")
>>> fp.readlines()
['hello world!\n', 'gloryroad\n', '每天进步一点点']
>>> fp.close()
>>> fp=open("test.txt")
>>> fp.readlines(4)
['hello world!\n']
>>> fp.readlines(4)
['gloryroad\n']
>>> fp.readlines(1)
['每天进步一点点']
>>> fp.readlines(1)
[]
>>> fp.close()
fileObject.write(str)
把str写到文件中,默认是不加换行符的,所以如果想换行的话,需要手动加入换行符"\n"
代码示例:
>>> fp=open("test.txt","w") #w模式将原来的内容覆盖
>>> fp.write("reapal.test")
11
>>> fp.close()
>>> with open("c.txt","w") as file:
... file.write("文件测试写入成功!")
...
9
>>> with open("c.txt") as file:
... file.readlines()
...
['文件测试写入成功!']
fileObject.writelines(seq)
把seq(序列)的内容全部写到文件中(多行一次性写入)。也不会自动加入换行符
代码示例:
testList=["五十六个民族\n","五十六支花\n","五十六个兄弟姐妹\n","是一家!"]
with open("a.txt","w") as file:
file.writelines(testList)
**注意:序列中的内容必须为字符串类型的数据,才能成功写入文件!
#造数据
with open("a.txt","w") as file:
file.writelines(list(map(lambda x:str(x)+"\n",range(101))))
fileObject.close()
file对象的close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。当一个文件对象的引用被重新指定给另一个文件时,python会关闭之前的文件。用close()方法关闭文件是一个很好的习惯。如果文件关闭后,还对文件进行操作会产生ValueError错误;但如果不及时关闭文件,有可能产生句柄泄露,丢失数据
fileObject.flush()
是将缓冲区中的内容写入硬盘。
文件其余操作
fileObject.closed
如果文件已关闭,返回True;否则返回False
fileObject.name
返回文件的名称
fileObject.mode
返回被打开文件的访问模式
代码示例:
>>> fp=open("test.txt","r")
>>> fp.closed
False
>>> fp.name
'test.txt'
>>> fp.mode
'r'
>>> fp.close()
>>> fp.closed
True
fileObject.next()
返回下一行,并将文件操作标记位移到下一行。把一个file用for...in line这样的循环遍历语句时,就是调用next()函数来实现
*在py2中适用,在py3中废弃了
Py2中代码示例:
>>> fp=open("test.txt")
>>> fp.next()
'reapal.test'
>>> fp.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> fp.close()
Py3中应用报异常:
>>> fp=open("zhigang.py","rb")
>>> fp.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: '_io.BufferedReader' object has no attribute 'next'
fileObject.fileno()
返回一个长整型的文件标签,不常用
代码示例:
>>> fp=open("test.txt")
>>> fp.fileno()
3
>>> fp.close()
fileObject.isatty()
文件是否是一个终端设备文件(linux服务器)
>>> fp=open("zhigang.py")
>>> fp.isatty()
False
>>> fp.close()
fileObject.truncate([size])
把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去;
>>> with open("gang.txt","r+") as fp:
... fp.truncate(10)
...
10
文件游标:
文件打开的时候,r或者w都是默认文件0的位置
fileObject.tell():
查看文件游标所处的当前位置,回车也会占用一个位置
代码示例:
with open("gang.txt","r",encoding="utf-8") as fp:
print (fp.tell())
print (fp.readline()) #执行此语句后,文件位置会发生变化
print (fp.tell())
with open("gang.txt","r",encoding="utf-8") as fp:
print (fp.tell())
print (fp.readline())
fp.seek(0,0) #恢复到初始位置
print (fp.tell())
fileObject.seek(offset,whence)
参数说明:
offset:相对于whence的偏移量,字节数,可以为负数,whence省略时,默认从文件开头算起;正数表示从前向后,负数表示从后向前
whence:给offset参数的偏移参考,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起
注意:使用时需使用b模式打开文件,否则只允许从文件头开始计算相对位置,从文件当前位置或文件末尾位置计算时就会引发异常
>>> fp.seek(-1,2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
io.UnsupportedOperation: can't do nonzero end-relative seeks
>>> fp=open("test.txt","rb")
>>> fp.tell() #默认从0位置开始
0
>>> fp.seek(5,1) #从当前位置往后移5位
5
>>> fp.tell()
5
>>> fp.seek(-5,1) #从当前位置往前移5位
0
>>> fp.seek(0,2) #移动到文件末尾位置
19
>>> fp.read() #末尾位置开始读取内容,返回为空
b''
>>> fp.close()
文件操作扩展
import linecache
#将文件所有行以列表的形式返回
file_content=linecache.getlines("gang.txt")
print (file_content)
#截取文件内容的一部分
file_content=linecache.getlines("gang.txt")[4:15]
print (file_content)
#返回指定行数的内容
file_content=linecache.getline("gang.txt",13)
print (file_content)
#文件发生改动,需要获取最新的文件内容时
file_content=linecache.updatecache("gang.txt")
print (file_content)
#更新缓存
linecache.checkcache("gang.txt")
#清理缓存
linecache.clearcache()