文本文件的读写主要通过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的使用范围。
最后,上下文管理器本质上是特殊方法的运用,这里我们不展开。
后续编写特殊方法的使用。