Python的IO操作
一、创建和打开文件
file=open(filename[,mode[,buffering[,encoding]]])
参数说明:
- filename:表示文件的路径,是一个字符串(要用引号括起来),如果该文件与当前的py文件在同一目录下,可以直接写文件的名字,否则需要写完整路径
- mode:指打开文件的模式,可以不写,默认为r(只读)
- buffering:用于指定文件的缓存模式,可以不写,默认为缓存模式,0表示不缓存,1表示缓存,大于1表示缓冲区的大小
- encoding:指定文件打开时采用的编码格式,默认为gbk
二、关闭文件
一种方法是使用file.close(),这种方法需要收到关闭
建议使用第二种,用with语句打开文件,在with语句执行完成只会会自动关闭文件
with open(filename[,mode[,buffering[,encoding]]]) as file
说明:其中的file相对于就是把open打开的文件赋值给了file,这样在with语句中操作完成之后文件就会自动关闭了
三、写入文件
file.write(string)
说明:其中string为要写入的字符串
四、读取文件
1、read()
file.read([size])
说明:size为要读取的字符的数目,汉字,字母,标点符号在这里无论是在utf-8还是在gbk下都算1个字符,特别注意的是换行符也算一个字符,size也可以不写,默认读取全部内容。
因为在读取文件时一般都是在打开文件时采用r或r+模式,文件的指针在头部,文件只能从头开始读,下面介绍一个seek()方法,可以移动文件指针到你想读的位置上。
file.seek(offset[,whence])
参数说明:
- file:表示已打开的文件对象
- offset:表示指定移动的字节个数
- whence:表示指针移动开始的位置。whence可以不写,默认值为0,表示从文件头开始,1表示从文件末尾开始。
特别注意:这里的offset表示的是移动字节的数目,不是字符的数目!!!这表示在不同的编码环境下移动到同一位置的offset值是不一样的。下面我举几个例子:
文件名为a.txt,内容如下
首先展示在utf-8编码下:
`with open('a.txt','r',encoding='utf-8') as file:
file.seek(8)
print(file.read())
运行结果是:
为什么会是这个结果呢?在utf-8中一个汉字占3个字节,换行符在windows系统中占2个字节(\r\n)。3*2+2=8,指针正好移动到"不"的前面。
在gbk编码下:
with open('a.txt','r',encoding='gbk') as file:
file.seek(8)
print(file.read())`
运行结果:
为什么又变成这个结果呢?在gbk环境下一个汉字占俩个字节,换行符在windows系统中占2个字节(\r\n)。2*4=8,指针真好定位到"不"的后面。
2、readline()
file.readline()
说明:直接从指针的位置开始读一行,直到读到换行符
3、 readlines()
file.readlines()
说明:直接从指针的位置开始读,把所有的行都读完,最后返回一个字符串列表