美文网首页
python学习笔记-tip49(io编程--文件读写)

python学习笔记-tip49(io编程--文件读写)

作者: 黑键手记 | 来源:发表于2018-10-19 14:59 被阅读0次

    引言

    python内置了读写文件的函数,用法和C语言是兼容的

    读文件--open()函数

    用法:传入文件名和标识符(r,w)即读,写
    示例:

       >>>f=open('/Users/guaju/test.txt','r')
    

    这样,我们就成功的打开了文件

    但是如果这个文件不存在,open()函数就会报出IOError的异常,并且给出错误码,和详细的信息告诉你文件不存在

    如果文件打开成功,我们就可以通过read()的方法,将文件中的内容全部读出来,然后用一个str对象表示出来,现在呢,我们看一个示例

    我们在桌面新建一个hello.txt的文件,然后里面输入内容“helloworld”,我们尝试读取一下这个文件中的数据

    下面我们来说下关闭文件的方法 close()

    文件打开然后操作完毕之后,必须要对文件进行关闭,因为文件对象会占用操作系统的资源,关闭文件意味着释放资源,所以我们必须有良好的编程习惯

        f.close()
    

    由于文件读写都有可能出现 IOError,所以一旦报错,关闭文件的代码:
    f.close()
    有时候会无法被调用到,程序就异常退出。
    所以,为了保证无论是否出错,都能保证正常的关闭文件,我们可以使用try...finally来实现

      try:
          f=open('Users/guaju/Desktop/hello.txt','r')
          print(f.read())
      finally:
          if f:
             f.close()
    

    这样写固然是合理的,但是如果我们频繁操作文件的话,这样写就有些繁琐了
    python提供了更加合适的方法
    with语句来自动帮助我们调用close()方法
    请看代码示例:

        with open('Users/guaju/Desktop/hello/txt','r') as f:
                print(f.read())
    

    这个写法实现的效果和上面的try...finally是一样的,但是代码却异常简洁

    我们来深究下read()方法

    上文中我们知道了,调用read()方法,会一次性的将文件中的全部信息读取出来,那么如果文件有10G,那么电脑内存就爆掉了,所以为了安全起见,可以反复调用

    • read(size)方法,这样每次最多读取size个字节的内容。
    • 另外,使用readline() 可以每次读取文件中的一行内容
    • 此外,使用readlines()可以一次性读取所有内容,并且按行返回list
      因此要根据需要,决定什么时候怎么调用

    经验之谈

    如果文件很小,read()方法是最佳的
    如果不能确定文件大小,那么read(size)来反复调用,比较保险
    如果是读取配置文件,那么使用readlines()比较合适

    下面来说明一下readlines()方法使用小示例

        for line in f.readlines():
             #strip()方法可以把末尾的回车符 ”\n“ 删掉
             print(line.strip())
    

    file-like Object

    就是一种类的类型,有read()方法的对象,在python中统称为file-like Object。
    这种file-like Object可以是
    file文件
    内存的字节流
    网络流
    自定义流
    等等
    file-like Object 不要求从特定类继承,只要写个 read() 方法就行了。

    StringIO 是在内存中创建的file-like Object,常用作临时缓冲。

    二进制文件

    前面提到的都是读取的文本文件,而且都是utf-8格式的文本文件,要读取二进制文件
    比如图片、视频、音频等,用‘rb’模式打开文件即可
    比如现在我要打开我桌面上的杨幂的图片
    路径为:‘Users/guaju/Desktop/ym.jpg’
    模式为:‘rb’
    那么就这样书写代码就可以了



    我们看到读取到的图片的信息是16进制展示的

    其实原图是这样的

    字符编码

    要读取飞utf-8编码的文本文件的话,就要给open()传入encoding的参数,例如读取GBK编码的文件,我们这么写

    f=open('User/guaju/Desktop/gbkfile.txt','r',encoding='gbk')
    

    当然,我们肯定会遇到编码不规则的文件,那么必然会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。
    遇到这种情况,open()函数还接受一个errors的参数,表示如果遇到编码错误后,如何处理,当然最简单的处理方式是忽略

        f=open('Users/guaju/Desktop/hello.txt','r',encoding='gbk',errors='ignore')
    

    写文件

    写文件和读文件是一样的,唯一区别调用open函数是,输入的模式变化,输入模式变为
    ‘w’ 或者是‘wb’,分别表示输出字符,或者输出二进制内容
    此外,“读”read() 则转化为写write()
    我们来看下示例代码

          with open('Users/guaju/Desktop/hello2.txt','w') as f1
          f1.write('hello python')
          with open('Users/guaju/Desktop/hello2.txt','r') as f2
          f2.read()    
    

    需要注意的是,程序执行完write()方法之后,要输入的文本或者字节有时并不会真正的完整的输出到文件中去,而是当我们调用close()方法时,才会完成完整的输出,所以我们一定不要忘了调用close()方法。
    最好的做法就是我上边的做法,使用with语句

    当然,如果要写入指定编码的文件,那么同上放一样,给open()方法设置encoding的配置,将字符串自动转换成为指定的编码

    还有两点需要注意

    • 如果文件不存在,那么不能直接写入,需要先创建再进行写入

    • 当我们写文件时,如果传入的模式是'w'的话,那么如果写的操作执行很多次,那么文件中的内容不会追加,而是会覆盖,那么怎么解决这个问题呢?
      其实这个模式替换成'a'就可以了

    我们来简单看一个示例



    本例是文件不存在的情况

    接下来我们先把文件创建出来,然后重新执行一遍


    现在大家看到区别了吧

    总结

    用到的函数有

    open()
    close()
    read()
    write()

    打开文件的配置常见的有

    'r'
    'w'
    'rb'
    'wb'
    'a'

    配置编码的方式

    encoding='编码方式'

    错误的处理方式

    errors='ignore'

    with的使用

    with open('文件路径','打开方式',encoding='编码方式',errors='处理方法') as f:

    不多,很简单,多练练就好了

    相关文章

      网友评论

          本文标题:python学习笔记-tip49(io编程--文件读写)

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