文本输入输出&上下文管理器(完成)

文本文件的读写主要通过open()所构建的文件对象来实现。

文本输入输出

f = open(文件名,模式)

最常用的模式有:

"r"         # 只读

“w”        # 写入

比如:f = open("test.txt","r")

一、文本文件在python安装目录下

我的python安装目录为:D:Program Files(x86)python

特别注意是根目录,导入文件找原因找了半天,发现自己没有在根目录...

此目录下存放了record.txt文件。

我们可以直接打开该文件。

1 >>> a = open('record.txt')      #安装目录下
2 >>> a.read()
3 'tom,12,86
lee,15,99
lucy,11,58
joseph,19,56'
4 >>> a = open('record.txt','w')  #写入
5 >>> a.write('tom,12,86')
6 >>> a = open('record.txt','r')  #读取
7 >>> a.read()
8 'tom,12,86'
9 >>> a.close()                   #关闭

注意

1.引用文件路径为单引号/双引号都可,不过文件路径名为字符串推荐使用单引号,个人更喜欢这种。

2.使用write修改文件,注意格式。并且write覆盖了原先文件内容。

3.空格的写法为

二、文本文件未在python安装目录下

在之前的python中如何调用.py文件中我们写到未在python目录导入文件的语句,我们尝试在文本输入输出时使用该语句。

 1 >>> sys.path
 2 ['D:\Program Files(x86)\python\Lib\idlelib', 'D:\Program Files(x86)\python\python27.zip', 
'D:\Program Files(x86)\python\DLLs', 'D:\Program Files(x86)\python\lib', 'D:\Program Files(x86)\python\lib\plat-win',
'D:\Program Files(x86)\python\lib\lib-tk', 'D:\Program Files(x86)\python', 'D:\Program Files(x86)\python\lib\site-packages'] 3 >>> sys.path.append('D:\Program Files(x86)\python\py') 4 >>> f = open('new3','r') #报错 5 6 Traceback (most recent call last): 7 File "<pyshell#37>", line 1, in <module> 8 f = open('new3','r') 9 IOError: [Errno 2] No such file or directory: 'new3' 10 >>> f = open('new3.py','r') #报错 11 12 Traceback (most recent call last): 13 File "<pyshell#38>", line 1, in <module> 14 f = open('new3.py','r') 15 IOError: [Errno 2] No such file or directory: 'new3.py' 16 >>> f = open('new3.txt','r') #报错 17 18 Traceback (most recent call last): 19 File "<pyshell#39>", line 1, in <module> 20 f = open('new3.txt','r') 21 IOError: [Errno 2] No such file or directory: 'new3.txt'

对比from 文件名 import * 之前的写法,在f = open(文件名,模式)中并不适用。

所以未在根目录下要想操作该文本,要使用文本的绝对路径,就是把目录写全。

 1 f = open('D:\Program Files(x86)\python\py\new3.txt','r')     #输出完整路径名
 2 f.read()
 3 'I like bananaxa3xa1' 
 4 f = open('D:\Program Files(x86)\python\py\new3.txt','w')     #写入模式
 5 f.write('i like apple!')
 6 f.close()                                                        #关闭 
 7 f = open('D:\Program Files(x86)\python\py\new3.py','r')      #尝试.py文件
 8 f.read()
 9 'I like bananaxefxbcx81'
10 f = open('D:\Program Files(x86)\python\py\new3.py','w')      #写入.py文件
11 f.write('i like apple!')
12 f.read()                                                         #直接读会报错
13 Traceback (most recent call last):
14   File "<pyshell#54>", line 1, in <module>
15   f.read()
16   IOError: File not open for reading
17 f.close()                                                        #关闭文件
18 f = open('D:\Program Files(x86)\python\py\new3.py','r')      #读取文件查看
19 f.read()
20 'i like apple!'

我们看到,想要查看写入后的文件,需要先读取模式打开该文件再进行查看,直接使用f.read()会报错。

练习

建立一个record.txt的文档,写入内容如下:

tom, 12, 86
Lee, 15, 99
Lucy, 11, 58
Joseph, 19, 56

再从record.txt中读取文件并打印。

答题:

 1 >>> f = open('D:\Program Files(x86)\python\py\record.txt','w')     #直接新建record.txt文件,写入模式;读取模式报错
 2 >>> f.write('tom,12,86
lee,15,99
lucy,11,58
joseph,19,56')          #写入文件内容
 3 >>> f.close()                                                          #关闭文件,可不关闭直接读取
 4 >>> f = open('D:\Program Files(x86)\python\py\record.txt','r')     #重新打开
 5 >>> f.read()                                                           #读取文件
 6 'tom,12,86
lee,15,99
lucy,11,58
joseph,19,56'
 7 >>> f.close()                                                          #关闭文件
 8 
 9 >>> f = open('D:\Program Files(x86)\python\py\record.txt') 
10 >>> content = f.readline()                                             #读取一行
11 >>> print (content)                                                    #输出结果
12 tom,12,86
13 
14 >>> content = f.readlines()                                            #读取全部
15 >>> print (content) 
16 ['lee,15,99
', 'lucy,11,58
', 'joseph,19,56']

我们发现,

1.可以直接写入模式新建文件,直接用读取模式新建时会报错。

2.写入文件内容后,可以不关闭输入读取模式,不会报错。

3.注意读取一行与所有行的写法。

参考:

content = f.read(N)                #读取N bytes的数据

content = f.readline()             #读取一行

content = f.readlines()           #读取所有行,储存在列表中,每个元素是一行。

上下文管理器

如果老是用f.close()来关闭文件,未免太繁琐。with...as...很好的解决了这个问题。

上下文管理器可以在不需要文件的时候,自动关闭文件

1 # without context manager
2 f = open('record.txt', 'w')
3 print(f.closed)               #whether the file is open
4 f.write('Hello World!')
5 f.close()
6 print(f.closed)               #再次检查文件是否关闭,输出结果为True/False

对比使用with...as...语句。

1 # with context manager
2 with open('record.txt', 'w') as f:
3     print(f.closed)                   #确认文件是否关闭,结果为False
4     f.write('Hello World!')
5 print(f.closed)                       
6 
7 with open('record.txt', 'w') as f:    #其实这样写,文件record.txt已经写入且关闭,print(f.closed)只是检查语句
8     f.write('Hello World!')

使用with...as...语句会使文本输入输出变得更加简洁。

两段程序实际上执行的是相同的操作。我们的第二段程序就使用了上下文管理器 (with...as...)。

上下文管理器有隶属于它的程序块。当隶属的程序块执行结束的时候(也就是不再缩进),上下文管理器自动关闭了文件 (我们通过f.closed来查询文件是否关闭)。

我们相当于使用缩进规定了文件对象f的使用范围

最后,上下文管理器本质上是特殊方法的运用,这里我们不展开。

后续编写特殊方法的使用。

原文地址:https://www.cnblogs.com/shengyin/p/11268945.html