zoukankan      html  css  js  c++  java
  • 文本输入输出&上下文管理器(完成)

    文本文件的读写主要通过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的使用范围

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

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

  • 相关阅读:
    大三寒假学习进度(3)
    大三寒假学习进度(2)
    大三寒假学习进度(1)
    Tensorflow深度学习(二)
    Tensorflow深度学习(一)
    了解使用Pyppeteer
    为什么我还可以继续使用python自动填问卷星?
    周总结(十四)
    docker常用命令总结
    周总结(十三)
  • 原文地址:https://www.cnblogs.com/shengyin/p/11268945.html
Copyright © 2011-2022 走看看