python文件操作
Open方法
返回的是一个文件的句柄,一个file对象
open(file, mode=’r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True):
file: 代表文件的路径
mode: 是代表文件的操作模式 r w b + t 等等
buffering:0,1,>1三个,0代表buffer关闭(只适用于二进制模式),1代表line buffer(只适用于文本模式),>1表示初始化的buffer大小;
encoding: 指定返回的数据采用何种编码
errors: strict,ignore,当取strict的时候,字符编码出现问题的时候,会报错,当取ignore的时候,编码出现问题,程序会忽略而过,继续执行
newline: 读取的时候->不指定newline默认开启Universal new line mode,其实就是相当于python2中rU模式,也就是文件无论是windows下的换行符”\r\n”还是linux下的”\n”都会被转换为”\n”
写入的时候->不指定newline会根据当前系统的默认换行符进行写入
closefd:默认是为True,参数中的file此时是传入文件的路径,如果设置成False那么只能接受fd
mode type | desc |
---|---|
r | 读取文件,如果文件不存在抛错 |
w | 写入文件,如果文件不存在则新建,如果存在会把文件清空以后再进行写入 |
w+ | 先重写后再读取文件 |
r+ | 先读取文件在重写文件,这个不是追加 |
a | 追加写入文件 |
a+ | 追加写入的同时进行读取 |
rb/wb/ab | 以二进制模式读取或者写入追加文件,这个不是说把一个普通的txt文件变成一个二进制的文件,而是以二进制的方式进行操作文件 |
rb/wb/ab/这种模式非常时候在socket进行数据传输的时候使用,在python中recv和send 只能发送字节而不是字符串,需要使用bytes()
方法对字符串进行转换,在传输文件时,如果直接以rb的模式进行读取,就不需要再用刀bytes()
使用open()进行操作文件,返回file对象1
f = open('test.log','r')
file对象read,readline,readlines
f.read()方法会读取所有的数据为字符串,如果指定f.read(1024) 读取1024个字节
f.readline()读取一行数据,f.readlines()读取所有的数据放入一个list
file对象write,writelines
f.write(str)方法把str类型的数据写入文件,而f.writelines()可以把一个list写入文件
file对象tell和seek
f.tell() 返回当前指针的位置,这个不是行号,是指针位置
f.seek(offset,whence)从文件中移动off个操作标记(文件指针),正往结束方向移动,负往开始方向移动,如果设定了whence参数,就以whence设定的起始位为准,0代表从头开始,1代表当前位置,2代表文件最末尾位置。
通过socket进行传输的时候,为了实现断点续传就可以用到seek()来实现:
file对象的close()
打开文件就要关闭,访问数据库以后也要关闭连接,访问一个url,也要结束1
2
3
4# 打开文件-读取-关闭
f = open('a.log','r')
data = f.read()
f.close()
1 | # 采用with方法,无需手动f.close() |
linecache模块读取文件
linecache 模块源码没有太多代码,其实就是读取文件缓存,直接返回的是文件里面的数据内容,而不是像open()方法返回一个文件句柄,然后还要关闭他
linecache 目的只是快速读取文件使用,他是不需要close(),linecache 模块没有使用到生成器,不适合读取大文件,从文件读取内容直接放到内存中,
1 | import linecache |