带你学python基础:文件读写,俗称IO操作

原文链接:blog.ouyangsihai.cn >> 带你学python基础:文件读写,俗称IO操作

这一节讲个挺有意思的知识,至少在我以前刚刚接触编程的时候,对于文件操作还是觉得很有意思的事情,这也许是有一种操作文件的激情吧,希望看到这篇文章的读者也会有这样的激情,说明还是很有兴趣的,当然,就算没有,可能是你的兴趣点不在这。

一、文件的打开

首先,我们还是从文件的打开与关闭讲起。讲这个之前,我们先了解一下文件操作的大致流程,这个流程不止 Python 是这样的,几乎所有的编程语言的操作都是这样的,有了这样的一个流程,再写程序的时候,思路就豁然开朗了。


从这个图我们可以看出,文件操作一般会经历打开文件、读写数据、关闭文件,这样的大概的流程,所以,下面的知识,我们就按照这个流程一一讲解涉及的知识点。

一提到文件打开,我们就会想到 open() 这个函数,打铁趁热,我们就将一下这个函数的用法。

open()

函数语法

open(name[, mode[, buffering[,encoding]]]) 

参数解释

  • name : 访问的文件名称的字符串值(区分绝对路径和相对路径)。
  • mode : mode 决定了打开文件的模式:只读,写入,追加等。
  • buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。

实践是检验真理的唯一标准

# -*- coding:utf-8 -*-
# 新建打开文件操作,打开文件hello.txt,以读取的模式打开
f = open('./hello.txt', 'r')

是不是易如反掌,这里只是打开了这个文件,还没有进行任何的操作,文件操作待我娓娓道来,这个实例中用到了文件读取的模式,介绍一下常用的模式。

注意:对于初学者来说,需要注意的是,模式b的意思是代表二进制读写+直接代表读写,也就是有读取和写入两个操作。也许你不理解什么是二进制读写,这里讲一下,数据的保存是有文本字符保存和二进制保存的,所以,在读写的时候,自然也就有两种读写方式了。具体的可以查查资料,学过 C 或者 C++ 就很清楚了。

高级的打开open

这里为什么说高级的打开呢?

在前面说到的文件操作流程中,是不是不可避免的都需要自己去执行关闭文件操作呢?其实不是的,在 Python 中提供了一种更加方便的形式,不需要手动的去关闭文件。

语法

with…open

实践是检验真理的唯一标准

with open('./hello.txt', 'r') as f:
    print(f)

注意:这里的as和前面提到过的as是异曲同工的,都是起到别名的作用。

至于为什么需要这种写法,就是可以避免每次需要手动关闭文件,这种方式会在需要的时候自动关闭。

二、文件的操作

文件操作流程第一步文件打开相信理解透彻了,接下来就是重头戏文件的操作了。

文件读取

read()方法

read的使用方法异常简单

read(num)

read()可以读取文件里面的内容。num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。

实践是检验真理的唯一标准
这里接着上面打开的流程接着写程序。

with open('./hello.txt', 'r') as f:
    # 如果不写入参数,代表读取全部内容
    str = f.read()
    print(str)
    print('*' * 10)
    # 读取4字节
    str2 = f.read(4)
    print(str2)

哪还有其他的读取方式吗?

readline()/readlines()

  • readline:读取第一行,返回一个字符串。
  • readlines:按照行的方式读取整个文件,每一行作为列表的一个元素,最后返回一个列表。

实践是检验真理的唯一标准

# 使用readlines
with open('./hello.txt', 'r') as f:
    content = f.readlines()
    print('类型:', type(content))

    for i in content:
        print(i)

print('*' * 20)

# 使用readline
with open('./hello.txt', 'r') as f:
    content = f.readline()
    print('类型:', type(content))

    for i in content:
        print(i)

文件写入

write()方法和writelines(seq)方法

这两个方式都是用于文件写入的。需要注意的是,他们写完后在文件末尾都不会写入换行符。

# 文件写入
with open('./hello.txt', 'a') as f:
    f.write('12345617777')
    f.writelines('I love you ! ')

print('*' * 20)

# 使用readlines读取
with open('./hello.txt', 'r') as f:
    content = f.readlines()
    for i in content:
        print(i)

可见不会自动加入换行符!

其他实用操作

在某些场景下,可能我们需要更加方便的处理文件,例如,当我们读取文件一半的时候,我们需要读文件的后面具体的某些内容,这时候,我们就需要移动文件的指针来读取了。当然,都不用担心,python 都提供了这些方法,下面就讲解这些方法。

这里需要介绍几个方法。

  • tell()
    返回文件游标操作的当前位置,以文件的开头为原点。

  • seek(offset[,whence])
    移动指针方法。
    offset :开始的偏移量,也就是代表需要移动偏移的字节数
    whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

实践是检验真理的唯一标准

例如,我们不从文件开头读取,从10个文字后开始读取

with open('./hello.txt', 'r') as f:
    f.seek(10, 0)
    print('当前位置:', f.tell())
    content = f.read()
    print(content)

最后再讲两个函数。

  • flush()
    把缓冲区的内容写入硬盘。

  • truncate()
    把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。

三、文件关闭

文件关闭是指,在文件操作完成之后,需要关闭。其实,看完前面的内容,文件关闭似乎不太重要了。那么如何使用呢,非常简单。

文件对象.close()
# 新建打开文件操作,打开文件hello.txt,以读取的模式打开
f = open('./hello.txt', 'r')
f.close()

文件操作的内容就这么多了!!!over!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • (放下却无处安放,试着站在母亲的角度,讲述着12岁弑母少年与母亲的死别。) 我游荡的灵魂 看着你,戴着手铐脚镣的儿...
    一句话说完阅读 3,153评论 27 97
  • 我一直觉得自己是个长不大的孩子,不管是二十岁还是二十五岁,觉得自己的心智还停留在十八岁,因为还是非常的天真,非常单...
    _Kayla_阅读 363评论 0 0
  • 昨天晚上去剪了头发。 为了可以偷懒,又一次狠心的把自己好不容易养长的头发给剪这么短了。其实我一直想留长发,然后把头...
    等候三世阅读 201评论 0 0