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

2018-10-19  本文已影响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()方法是最佳的
如果不能确定文件大小,那么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的配置,将字符串自动转换成为指定的编码

还有两点需要注意

我们来简单看一个示例



本例是文件不存在的情况

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


现在大家看到区别了吧

总结

用到的函数有

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

打开文件的配置常见的有

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

配置编码的方式

encoding='编码方式'

错误的处理方式

errors='ignore'

with的使用

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

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

上一篇下一篇

猜你喜欢

热点阅读