前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python基础—文件操作

python基础—文件操作

作者头像
dogfei
发布2020-07-31 14:33:36
3270
发布2020-07-31 14:33:36
举报
文章被收录于专栏:devops探索devops探索

1、文件读写操作

文件读操作

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、文件读写操作
    • 文件读操作
      • 文件对象方法:
    • 文件写操作
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档