r+具有读写属性,文件必须存在否则报错,以r+打开文件不会清空文件,读取从头读取,写入从读取截止的地方开始写,A:如果打开的文件没有读取直接写入内容,那么就是从头开始写;B:如果打开的源文件有内容,从读取到的位置开始写,B-1:如果没有读取直接写,那么新写的内容就是从头开始写入,源文件以前的内容就在新写的内容后面后面、B-2:如果打开源文件有内容先读取了内容,在写入新内容,写入开始的位置就是从读取结束的位置开始写入 w+具有读写属性,文件不存在创建,以w+打开文件时候直接清空(因为一打开就是清空,所以read不到数据)文件中的内容,从头开始写。 r 以只读方式文件,该文件必须存在。 r+ 以读写方式打开可读写的文件,写的放是见上面,该文件必须存在。 w 打开只写文件,不能读(调用read方法直接报错),若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 w+ 打开可读写文件,可读可写,若文件存在则文件长度清为零(调用read方法不会报错,但调用read方法也读不到消息,都清空了),即该文件内容会消失。若文件不存在则建立该文件。
(其实w与w+区别可以理解为,调用w调用read报错,w+调用read不报错,其他都一样)
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。 a+ 以附加方式打开可读写的文件,(打开文件时候指针指导文件末尾,直接读取读取不到内容,要将指针指到文件头,w+是直接清空文件,指针在文件最头部)若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。fo = open('test.txt','w+')
fo,tell()//获取指针位置
fo.seek(0,0) / /指定指针位置
fo.write('ddddddddddd')//写入
fo.writelines(['aaa','bbb','ccc'])
fo.read(5)//读5个字节,不写5 读全部
fo.readline()//一下读一行
fo.readlines()//吧所有内容读到一个数组,一行一个
fo.close()
1、打开、关闭文件
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk',errors='ignore')
open第三个参数是编码, encoding='gbk',都文本文件不需要传,非文本文件需要穿
第四个参数是遇到编码错误忽略它, errors='ignore',因为在文本文件中可能夹杂了一些非法编码的字符
方法一:一般写法
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
方法二:简写(不需要写close,with默认会调用)
with open('/path/to/file', 'r') as f:
print(f.read())
2、内存读写
2.1 : StringIO只能读写字符串
写:
from io import StringIO
f = StringIO()
f.write('hello')
f.write(' ')
f.write('world')
print(f.getvalue())
读取:
读取:
f = StringIO('hello\nniubi\nworld')
while True:
s = f.readline()
if s == '':
break;
print(s.strip())
2.2 BytesIO 操作流
from io import BytesIO
from io import BytesIO
f = BytesIO()
f.write('牛逼'.encode('utf-8'))
#请注意,写入的不是 str,而是经过 UTF-8 编码的 bytes。
print(f.getvalue())
和 StringIO 类似,可以用一个 bytes 初始化 BytesIO,然后,像读文件一样读取:
f = BytesIO (b'\xe4\xb8\xad\xe6\x96\x87')
f.read()