1 2 3 4 | >>> f = open('/devilf/data/1.txt','r') >>> f.read() 'hello,world' >>> f.close() |
---|
1 2 3 4 5 6 | r 使文件只读 w 使文件只写(同名文件,该操作会覆盖原文件) a 以追加方式打开文件 r+ 以读写方式打开文件 b 以二进制方式打开文件 不指定时,默认为'r' |
---|
1)read()
要读取文件内容,需要调用 f.read(size),该方法读取若干数量的数据并以字符串形式返回其内容,size 是可选的数值,指定字符串长度。如果没有指定 size 或者指定为负数,就会读取并返回整个文件。当文件大小为当前机器内存两倍时,就会产生问题。反之,会尽可能按比较大的 size 读取和返回数据。如果到了文件末尾,f.read() 会返回一个空字符串(”“):
1 2 3 4 5 | >>> f = open('/devilf/data/hosts','r') >>> f.read() 'baijiahao.baidu.com\ntv.cntv.cn\nwww.boc.cn\nm.shangxueba.com\njingyan.baidu.com\nwww.ccyb.gov.cn\nmt.sohu.com\nm.xiazaiba.com\nwww.12333sb.com\nwww.hualife.cc\ndaily.zhihu.com\nsh.iyaya.com\nm.ecpic.com.cn\nm.findlaw.cn\nstocks.sina.cn\nlife.cntaiping.com\nwww.sino-life.com\nzhuanlan.zhihu.com\nwww.china-insurance.com\nshop.taikang.com\nm.sinosig.com\nwenba.xiangrikui.com\nicid.iachina.cn\nwww.aon.com\nwww.biabii.org.cn\nwww.prime-care.com\nwww.bx16.cn\nm.littelfuse.com\nwww.renrenbx.com\n' >>> f.read() '' |
---|
2)readline()
f.readline() 从文件中读取单独一行,字符串结尾会自动加上一个换行符( \n ),只有当文件最后一行没有以换行符结尾时,这一操作才会被忽略。这样返回值就不会有混淆,如果 f.readline()返回一个空字符串,那就表示到达了文件末尾,如果是一个空行,就会描述为 ‘\n’,一个只包含换行符的字符串:
1 2 3 4 5 6 7 8 9 | >>> f = open('/devilf/data/hosts','r') >>> f.readline() 'baijiahao.baidu.com\n' >>> f.readline() 'tv.cntv.cn\n' >>> f.readline() 'www.boc.cn\n' >>> f.readline() 'm.shangxueba.com\n' |
---|
3)readlines()
f.readlines() 返回一个列表,其中包含了文件中所有的数据行。如果给定了 sizehint 参数,就会读入多于一行的比特数,从中返回多行文本。这个功能通常用于高效读取大型行文件,避免了将整个文件读入内存。这种操作只返回完整的行
1 2 3 | >>> f = open('/devilf/data/hosts','r') >>> f.readlines() ['baijiahao.baidu.com\n', 'tv.cntv.cn\n', 'www.boc.cn\n', 'm.shangxueba.com\n', 'jingyan.baidu.com\n', 'www.ccyb.gov.cn\n', 'mt.sohu.com\n', 'm.xiazaiba.com\n', 'www.12333sb.com\n', 'www.hualife.cc\n', 'daily.zhihu.com\n', 'sh.iyaya.com\n', 'm.ecpic.com.cn\n', 'm.findlaw.cn\n', 'stocks.sina.cn\n', 'life.cntaiping.com\n', 'www.sino-life.com\n', 'zhuanlan.zhihu.com\n', 'www.china-insurance.com\n', 'shop.taikang.com\n', 'm.sinosig.com\n', 'wenba.xiangrikui.com\n', 'icid.iachina.cn\n', 'www.aon.com\n', 'www.biabii.org.cn\n', 'www.prime-care.com\n', 'www.bx16.cn\n', 'm.littelfuse.com\n', 'www.renrenbx.com\n'] |
---|
还有就是通过遍历整个文件对象来读取文件行,这是一种高效、快速、并且代码简洁的方式:
1 2 3 4 5 6 7 8 9 10 11 12 | >>> f = open('/devilf/data/hosts','r') >>> for line in f: ... print(line,end='') ... baijiahao.baidu.com tv.cntv.cn www.boc.cn m.shangxueba.com jingyan.baidu.com www.ccyb.gov.cn mt.sohu.com m.xiazaiba.com |
---|
这里end=’ ‘ 的使用可以去掉每一行后面的\n换行符,等同于strip(),例如:
1 2 3 4 5 6 7 8 9 10 11 12 | >>> f = open('/devilf/data/hosts','r') >>> for line in f: ... print(line.strip()) ... baijiahao.baidu.com tv.cntv.cn www.boc.cn m.shangxueba.com jingyan.baidu.com www.ccyb.gov.cn mt.sohu.com m.xiazaiba.com |
---|
f.write(string)方法将string的内容写入文件,并返回写入字符的长度:
1 2 3 4 5 6 7 8 | >>> f = open('/devilf/data/4.txt','w') >>> f.write('This is a test!') 15 >>> f.close() >>> f = open('/devilf/data/4.txt','r') >>> f.read() 'This is a test!' >>> f.close() |
---|
如果要写入其他非字符串的内容,首先需要将它转换为字符串:
1 2 3 4 5 6 7 8 9 10 | >>> value = ('this is a word',11,'hello world') >>> s = str(value) >>> f = open('/devilf/data/5.txt','w') >>> f.write(s) 37 >>> f = open('/devilf/data/5.txt','r+') >>> for line in f: ... print(line.strip()) ... ('this is a word', 11, 'hello world') |
---|
注:当我们使用完一个文件时,调用f.close()方法就可以关闭并释放其占用的所有系统资源,因为wen’jian’dui’xiang在调用完f.close()方法后,再次使用文件对象时将会报错。
我们可以使用try-finally方式来处理文件对象,便不用调用f.close()方法,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | >>> try: ... f = open('/devilf/data/hosts','r') ... print(f.read()) ... finally: ... if f: ... f.close() ... baijiahao.baidu.com tv.cntv.cn www.boc.cn m.shangxueba.com jingyan.baidu.com www.ccyb.gov.cn mt.sohu.com m.xiazaiba.com |
---|
或者直接用with处理文件,更加简洁:
1 2 3 4 5 6 7 8 9 10 11 12 | >>> with open('/devilf/data/hosts','r+') as f: ... file = f.read() ... print(file) ... baijiahao.baidu.com tv.cntv.cn www.boc.cn m.shangxueba.com jingyan.baidu.com www.ccyb.gov.cn mt.sohu.com m.xiazaiba.com |
---|
有时候我们需要读写字节数据,例如一些二进制文件,图片或声音等,我们可以使用rb或者wb等,例如:
1 2 3 4 5 6 | with open('somefile.bin', 'rb') as f: data = f.read() # Write binary data to a file with open('somefile.bin', 'wb') as f: f.write(b'Hello World') |
---|
有时候向文件中写入数据时,使用w会覆盖原文件,这时我们可以使用x模式来解决这个问题:
1 2 3 4 5 6 7 8 9 10 | >>> with open('1.txt','xt') as f: ... f.write('hello world') ... Traceback (most recent call last): File "<stdin>", line 1, in <module> FileExistsError: [Errno 17] File exists: '1.txt' >>> with open('1.t','xt') as f: ... f.write('hello world') ... 11 |
---|
使用gzip和bz2模块,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | GZIP: >>> with gzip.open('gzip.1','wt') as f: ... f.write('hello world\n') ... 12 >>> with gzip.open('gzip.1','rt') as f: ... print(f.read()) ... hello world bz2: import gzip with gzip.open('somefile.gz', 'wt') as f: f.write(text) # bz2 compression import bz2 with bz2.open('somefile.bz2', 'wt') as f: f.write(text) |
---|
使用compresslevel关键字参数来指定压缩级别
1 2 3 4 5 6 7 8 9 | >>> with gzip.open('gzip.2','wt',compresslevel=5) as f: ... data = 'hello world' ... f.write(data) ... 11 >>> with gzip.open('gzip.2','rt') as f: ... print(f.read()) ... hello world |
---|