美文网首页程序员
跟我读python3文档:027_读写文件(7.2. Readi

跟我读python3文档:027_读写文件(7.2. Readi

作者: 咖喱py | 来源:发表于2017-09-15 17:54 被阅读141次

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


往期回顾

  • 匿名函数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将会用到~


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

相关文章

网友评论

    本文标题:跟我读python3文档:027_读写文件(7.2. Readi

    本文链接:https://www.haomeiwen.com/subject/javjsxtx.html