跟我读python3文档:027_读写文件(7.2. Reading and Writing Files)

贯穿始终的理念:别废话,就是干!


往期回顾

  • 匿名函数lambda
  • 列表推导式
  • 数据结构
  • 模块

文档解读

python3文档第七小节链接地址:7.2. Reading and Writing Files

本章主要讲解7.2. Reading and Writing Files(读写文件)这个小节


作者:咖喱py

文件读写这部分相对好理解一些,就是:

  • 打开文件 ➡️ 读文件 ➡️ 关闭文件
  • 打开文件 ➡️ 写文件 ➡️ 关闭文件

我们把这三部分分开讲:


第一部分:打开文件

这一部分会略带一点读写文件的内容。

读文件就是用读模式打开文件,用读方法读取文件;
写文件就是用写模式打开文件,用写方法写入文件。
关键词就是:模式、方法

注意:读和写,是分开的两件事情!

接下来我们来看这两件事情的异同之处。

>>> f = open('workfile', 'w')
  • open( )函数打开文件,
  • 函数的第一个字符串参数代表文件,
  • 函数的第二个字符串参数代表模式,例如,常见的有如下模式字母:
字母 模式意义
'r' 读取文件
'w' 写入文件,如果文件存在,则替换文件
'a' 续写文件
'b' 二进制模式,常与其他字母组合使用

其他模式字母请参考文档:模式字母

有些模式可以相互组合,比如:

  • 在模式后面加上b模式,可以进行二进制数据处理
  • 加上+(加号),代表我们可以对文件进行读

可能+(加号)那里你有点不理解他的意思。因为你还没有明白,“读和写是两件事”是什么意思。

我们继续往下看例子,你很快就能明白。

写入文件:

  • 在写模式下,用写方法,即write( )方法
>>> a = open('test.py', 'w')                  #用写模式打开文件,把文件对象赋值给a。
>>> a.write('This is the entire file.\n')     #用write()方法写入文件
25                                            #打印出写入的字符数量

读取文件:

  • 在读模式下,用读方法,即read( )方法
>>> b = open('test.py', 'r')                  #用读模式打开文件,把文件对象赋值给b。
>>> b.read()                                  #用read()方法读文件
'This is the entire file.\n'                  #文件内容被打印出来

下面来体验一下什么叫做:读和写是两件事

在读模式下,用write( )方法

>>> c = open('test.py', 'r')                   #用读模式打开文件,把文件对象赋值给c。
>>> c.write('galipy')                          #尝试在读模式中,写入内容。
Traceback (most recent call last):             #程序出错
  File "<stdin>", line 1, in <module>
io.UnsupportedOperation: not writable

注意报错的最后一句话,写明了不支持写入操作。

也就是说,我们在读模式,就只能读取文件,不能写入文件。
在写模式,就只能写入文件,不能读取文件。

现在明白“读和写是两件事”是什么意思了吧。
相当于,如果你以读模式打开文件,那就只能读取文件;如果还想要写入文件,就只能用写模式再打开一遍文件。

那么有没有什么办法可以简化一下这个步骤呢?
答案就是:添加+(加号)模式。

>>> c = open('test.py', 'r+')                   #用读模式与加号模式打开文件,把文件对象赋值给c。
>>> c.write('galipy')                           #尝试在读模式中,写入内容。
6                                               #返回写入的字符数量

第二部分:读写文件

这部分其实是讲读写文件的细节的

我们在进行读或写操作时,一定要时刻明白自己是从哪里读,读到哪了?从哪里写,写在哪了?

你可能会天真的理解为从头读,从头写。
但实际情况可能和你想的不太一样。

长者怎么说的来着?
图样图森破~

读文件

#假设你有一个test.py文件,里面只写了一句话:'This is the entire file.'
#现在我们要读取它

>>> b = open('test.py', 'r')                  #用读模式打开文件,把文件对象赋值给b。
>>> b.read()                                  #用read()方法读文件
'This is the entire file.\n'                  #文件内容被打印出来

#如果我们再次调用read()方法会怎么样?它会从哪开始读?还是从头吗?

>>> b.read()
''
#是不是没有得到你想要的结果?

现在明白这个从哪读到底是从哪读了吗?
当你第一次启动read( )方法时,它的确是从头开始读的,但是当你第二次调用read( )方法时,它是接着上一次调用开始读的。
write( )方法也是一样。如果你连续调用,那么他会连续接着写。

这样有什么好处呢?这样可以让我们一次只读取一部分,然后接着读下一部分。

比如你有一个50G的文件,但你的电脑就2G内存,你要怎么办呢?如果你直接一次性打开,估计你的电脑就死机了。。。所以,我们需要分多次读取。

>>> c.read(20)                      #一次读取20个字符,然后多次调用

分次读取还有一些其他的方法,比如:

c.readline()                         #一次读取一行

或者

>>> for a_line in c:                 #用循环遍历的方法一次读取一行
...     print(a_line, end='')
...
This is the first line of the file.
Second line of the file

如果你想要读取文件中所有的行,你也可以使用 list(f) 或 f.readlines()。

写文件

一开始我们已经接触过写文件了,那么它有哪些需要注意的呢?

关键点在于write( )方法的参数!
这个参数必须是一个字符串

也就是说,我们只能往文件里写入字符串类型!
不能是整数类型,不能是列表类型,不能是其他任何类型!
一定要记住write()方法的参数是字符串类型这一点,因为我们在讲解json时,还会用到这点。

>>> a = open('test.py', 'w')                  #用写模式打开文件,把文件对象赋值给a。
>>> a.write('This is the entire file.\n')     #用write()方法写入文件
25                                            #打印出写入的字符数量

要想写入其他类型,我们也需要先把它们转化为字符串类型在写入

>>> value = ('the answer', 42)
>>> s = str(value)                             #把元组类型转化为字符串类型了
>>> f.write(s)
18

读写文件的主要细节就这些,不过还有一些拓展方法值得学习:

  • tell()方法
    查看读取到的位置
  • seek(offset, from_what)方法
    设置读取位置

具体使用方法,请自行学习~


第三部分:关闭文件

为了保证文件内容的正确性,同时,为了节约内存的使用,我们每次对文件进行完操作之后都要关闭文件。

>>> a = open('test.py', 'w')                  #用写模式打开文件,把文件对象赋值给a。
>>> a.write('本文作者是咖喱py.\n')              #用write()方法写入文件
11     
>>> a.close()                                 #用close()方法关闭文件

但是,一般情况下,我们的文件操作都是通过脚本文件执行的。一旦程序运行出错,我们的close()操作可能就无法执行。
为了保证close()正确执行,于是我们就要用到try和finally两个关键字。

注意!从现在开始,我们要写脚本文件了,不再只是在交互模式里过家家了。

新建脚本firstFile.py
输入如下内容:

myfile = open('test.py','r')
try:
  for line in myfile:              #注意缩进关系
    print(line, end='')
finally:
  my file.close()

文件会执行try语句块中的内容,不论此语句块中的内容能不能成功运行,程序最后都会去执行finally语句块中的内容。
这样就可以保证close()这个关闭操作100%运行了。

但是,就像我最开始那期的文章里介绍的,程序猿都是懒惰的,每次都输入那么多很麻烦。

下面给出精简办法,用with、as关键字:

with open('test.py','r') as myfile:
  for line in myfile:
    print(line, end='')

这三行代码和上面的六行代码做的是相同的事情。只不过有些操作被隐藏了起来。
参考着上面的try、finally语句块,试试自己理解with、as语句块发生了什么~

by_ 咖喱py


今天就讲到这里吧~
记住write( )方法的参数特点哟~下期讲解json将会用到~


最近发现文章被盗的很凶,而且还不署名。。。
你们的良心不会痛嘛~

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

推荐阅读更多精彩内容